iOS 簡單使用description方法

????簡單的說說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)在中文了,不需要其他操作

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,906評論 33 466
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,101評論 0 9
  • 寫在前面 看完了廖大神的 JavaScript 教程,特記錄一下從0搭建一個完整的 koa2 工程,主要包含: 處...
    二娃__閱讀 2,372評論 0 6
  • 伊比利亞的陽光依舊明媚,地中海的風(fēng)也依舊輕浮,時至今日,朋友說:皇家馬德里迎來了一個全新的鼎盛時代,那一抹白色,光...
    二胡忽悠閱讀 210評論 0 0
  • 琴棋書畫詩酒茶, 凡生活,缺一不可。 許多人說,生活如此匆忙, 城市孤獨像是鋪天蓋地而來的浪潮, 足夠?qū)⒚β狄惶斓?..
    嵐曉曉閱讀 485評論 0 0

友情鏈接更多精彩內(nèi)容