????簡單的說說ios中的description方法劳翰,在iOS中description方法是一個(gè)非常實(shí)用的方法,在調(diào)試程序時(shí)馒疹,經(jīng)常要打印并查看對(duì)象的信息佳簸。一種辦法是編寫代碼把對(duì)象的全部屬性都輸出到日志中。但是最常用的還是:
NSLog(@"%@",object);
????在構(gòu)建需要打印的日志的字符串時(shí)颖变,object對(duì)象會(huì)收到description消息生均,該方法返回的描述信息將取代“格式字符串里的%@”。如下:
NSArray *arr = @[@"Tom",@"Jerry",@"Kitty"];
NSLog(@"%@",arr);
輸出結(jié)果:
(
Tom,
Jerry,
Kitty
)
????有的時(shí)候如果我們要自定義類腥刹,那么我們要用到description方法時(shí)就要覆寫description才能更有意義马胧,如果不重寫這個(gè)方法就會(huì)調(diào)用NSObject類實(shí)現(xiàn)的默認(rèn)方法。這個(gè)方法定義在NSObject協(xié)議里衔峰,不過NSObject累也實(shí)現(xiàn)了它佩脊。因?yàn)镹SObject并不是唯一的“根類”蛙粘,所以許多方法都要定義在NSObject協(xié)議里。下面就是覆寫description方法:
- (NSString *)description
{
return [NSString stringWithFormat:@"%@ %@",_firstName,_lastName];
}
????在這個(gè)的firstName和lastName是類中的屬性威彰。調(diào)用如下:
User *user = [[User alloc] initWithFirstName:@"Jame" lastName:@"Jan"];
NSLog(@"%@",user);
打印的結(jié)果如下:
Jame Jan
????這樣就能過通過description方法得到更多需要的信息了出牧,但是這樣還是有一定的問題的,當(dāng)我們想輸出多個(gè)值的時(shí)候抱冷,會(huì)使數(shù)據(jù)變得可讀性較差崔列,那么我們可以通過字典的方式作為description的返回值:
-(NSString *)description
{
return [NSString stringWithFormat:@"%@ ",@{
@"name":_name,
@"age":@(_age),
@"sex":_sex
};
}
????這樣直接為實(shí)例變量留好位置,然后逐個(gè)打印出來旺遮,用字典來實(shí)現(xiàn)這個(gè)功能可以令代碼更易于維護(hù):如果以后還要向類中新增屬性赵讯,要在description中打印,只更改字典就可以了耿眉。
NSObject協(xié)議中還有一個(gè)方法边翼,那就是debugDescription,這個(gè)方法和description相似鸣剪,區(qū)別就在debugDescription方法是開發(fā)者在調(diào)試器中以控制臺(tái)命令打印對(duì)象時(shí)才調(diào)用的组底。在NSObject類的默認(rèn)實(shí)現(xiàn)中,此方法只有直接調(diào)用了description筐骇。
通過設(shè)置斷點(diǎn)的方式债鸡,在控制器中通過如:po user 這樣的方法就能打印出debugDescription方法中的描述信息,有的時(shí)候我們只是想把簡單的信息放在普通的描述信息中铛纬,而把更詳盡的內(nèi)容放在調(diào)試所用的描述信息里厌均,這樣就要重寫兩個(gè)方法,在description中返回簡單信息告唆,在debugDescription返回詳盡的信息并通過po命令打印棺弊。
還有一個(gè)問題就是在輸出數(shù)組的中存在中文的時(shí)候就是以u(píng)tf-8的形式輸出,所以在這里可以用方法攪拌的方式進(jìn)行轉(zhuǎn)換格式擒悬。
我們就以數(shù)組為例:
首先創(chuàng)建一個(gè)NSObject的類別同時(shí)要加上頭文件
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);
// 改變兩個(gè)方法的具體指針指向
method_exchangeImplementations(oldMethod, newMethod);
}
然后再創(chuàng)建一個(gè)NSArray的類別添加代碼如下:
+ (void)load {
// 該方法會(huì)在加載這個(gè)類的時(shí)候執(zhí)行(APP啟動(dòng)時(shí)會(huì)加載模她,只執(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)在中文了,不需要其他操作