????簡單的說說ios中的description方法,在iOS中description方法是一個非常實用的方法,在調(diào)試程序時,經(jīng)常要打印并查看對象的信息。一種辦法是編寫代碼把對象的全部屬性都輸出到日志中。但是最常用的還是:
NSLog(@"%@",object);
????在構(gòu)建需要打印的日志的字符串時,object對象會收到description消息,該方法返回的描述信息將取代“格式字符串里的%@”。如下:
NSArray *arr = @[@"Tom",@"Jerry",@"Kitty"];
NSLog(@"%@",arr);
輸出結(jié)果:
(
Tom,
Jerry,
Kitty
)
????有的時候如果我們要自定義類,那么我們要用到description方法時就要覆寫description才能更有意義,如果不重寫這個方法就會調(diào)用NSObject類實現(xiàn)的默認方法。這個方法定義在NSObject協(xié)議里,不過NSObject累也實現(xiàn)了它。因為NSObject并不是唯一的“根類”,所以許多方法都要定義在NSObject協(xié)議里。下面就是覆寫description方法:
- (NSString *)description
{
return [NSString stringWithFormat:@"%@ %@",_firstName,_lastName];
}
????在這個的firstName和lastName是類中的屬性。調(diào)用如下:
User *user = [[User alloc] initWithFirstName:@"Jame" lastName:@"Jan"];
NSLog(@"%@",user);
打印的結(jié)果如下:
Jame Jan
????這樣就能過通過description方法得到更多需要的信息了,但是這樣還是有一定的問題的,當(dāng)我們想輸出多個值的時候,會使數(shù)據(jù)變得可讀性較差,那么我們可以通過字典的方式作為description的返回值:
-(NSString *)description
{
return [NSString stringWithFormat:@"%@ ",@{
@"name":_name,
@"age":@(_age),
@"sex":_sex
};
}
????這樣直接為實例變量留好位置,然后逐個打印出來,用字典來實現(xiàn)這個功能可以令代碼更易于維護:如果以后還要向類中新增屬性,要在description中打印,只更改字典就可以了。
NSObject協(xié)議中還有一個方法,那就是debugDescription,這個方法和description相似,區(qū)別就在debugDescription方法是開發(fā)者在調(diào)試器中以控制臺命令打印對象時才調(diào)用的。在NSObject類的默認實現(xiàn)中,此方法只有直接調(diào)用了description。
通過設(shè)置斷點的方式,在控制器中通過如:po user 這樣的方法就能打印出debugDescription方法中的描述信息,有的時候我們只是想把簡單的信息放在普通的描述信息中,而把更詳盡的內(nèi)容放在調(diào)試所用的描述信息里,這樣就要重寫兩個方法,在description中返回簡單信息,在debugDescription返回詳盡的信息并通過po命令打印。
還有一個問題就是在輸出數(shù)組的中存在中文的時候就是以utf-8的形式輸出,所以在這里可以用方法攪拌的方式進行轉(zhuǎn)換格式。
我們就以數(shù)組為例:
首先創(chuàng)建一個NSObject的類別同時要加上頭文件
import <objc/runtime.h>
添加代碼如下:
+ (void)sjt_exchangeSelector:(SEL)oldSel andNewSelector:(SEL)newSel {
Method oldMethod = class_getInstanceMethod([self class], oldSel);
Method newMethod = class_getInstanceMethod([self class], newSel);
// 改變兩個方法的具體指針指向
method_exchangeImplementations(oldMethod, newMethod);
}
然后再創(chuàng)建一個NSArray的類別添加代碼如下:
+ (void)load {
// 該方法會在加載這個類的時候執(zhí)行(APP啟動時會加載,只執(zhí)行一次)
// 此處交換descriptionWithLocale:與自己寫的my_descriptionWithLocale:的方法指針
[self sjt_exchangeSelector:@selector(descriptionWithLocale:) andNewSelector:@selector(my_descriptionWithLocale:)];
}
- (NSString *)my_descriptionWithLocale:(id)locale {
NSString *desc = [self my_descriptionWithLocale:locale];
desc = [self replaceUnicode:desc];
return desc;
}
- (NSString *)replaceUnicode:(NSString *)unicodeStr {
NSString *tempStr1 = [unicodeStr stringByReplacingOccurrencesOfString:@"\\u" withString:@"\\U"];
NSString *tempStr2 = [tempStr1 stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
NSString *tempStr3 = [[@"\"" stringByAppendingString:tempStr2] stringByAppendingString:@"\""];
NSData *tempData = [tempStr3 dataUsingEncoding:NSUTF8StringEncoding];
NSString* returnStr = [NSPropertyListSerialization propertyListFromData:tempData
mutabilityOption:NSPropertyListImmutable
format:NULL
errorDescription:NULL];
return [returnStr stringByReplacingOccurrencesOfString:@"\\r\\n" withString:@"\n"];
}
????這樣就能夠正常的現(xiàn)在中文了,不需要其他操作