1.description介紹:
1.NSLog(@"%@", objectA);這會自動調(diào)用objectA的description方法來輸出ObjectA的描述信息.
1.2.description方法默認返回對象的描述信息(默認實現(xiàn)是返回類名和對象的內(nèi)存地址)
1.3.description方法是基類NSObject 所帶的方法,因為其默認實現(xiàn)是返回類名和對象的內(nèi)存地址, 這樣的話,使用NSLog輸出OC對象,意義就不是很大,因為我們并不關(guān)心對象的內(nèi)存地址,比較關(guān)心的是對象內(nèi)部的一些成變量的值萧朝。因此,會經(jīng)常重寫description方法,覆蓋description方法 的默認實現(xiàn)
2.debugDescription簡介:
debugDescription方法是開發(fā)者在調(diào)試器中以控制臺命令打印對象時才調(diào)用的。在NSObject類的默認實現(xiàn)中,此方法只是直接調(diào)用了description缎除。
在開發(fā)過程中, 往往會有很多的model來裝載屬性. 而在開發(fā)期間經(jīng)常會進行調(diào)試查看model里的屬性值是否正確. 那么問題來了畏铆, 在objective-c里使用NSLog("%@",model)這行代碼打印出來的卻是model的地址. 不是我們所想要的結(jié)果,這樣往往不利于調(diào)試。所以我們需要給NSObject添加一個分類去重寫
- (NSString *)description方法税产。如下代碼:
// 重寫debugDescription, 而不是description
- (NSString *)debugDescription {
//判斷是否時NSArray 或者NSDictionary NSNumber 如果是的話直接返回 debugDescription
if ([self isKindOfClass:[NSArray class]] || [self isKindOfClass:[NSDictionary class]] || [self isKindOfClass:[NSString class]] || [self isKindOfClass:[NSNumber class]]) {
return [self debugDescription];
}
//聲明一個字典
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
//得到當(dāng)前class的所有屬性
uint count;
objc_property_t *properties = class_copyPropertyList([self class], &count);
//循環(huán)并用KVC得到每個屬性的值
for (int i = 0; i<count; i++) {
objc_property_t property = properties[i];
NSString *name = @(property_getName(property));
id value = [self valueForKey:name]?:@"nil";//默認值為nil字符串
[dictionary setObject:value forKey:name];//裝載到字典里
}
//釋放
free(properties);
//return
return [NSString stringWithFormat:@"<%@: %p> -- %@",[self class],self,dictionary];
}
實現(xiàn)效果如下:
屏幕快照 2017-08-11 下午3.41.32.png
github地址