日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NSObject协议中方法:description 和 debugDescription

發(fā)布時間:2024/1/17 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NSObject协议中方法:description 和 debugDescription 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

description基本概念

?

1.NSLog(@"%@", objectA);這會自動調(diào)用objectA的description方法來輸出ObjectA的描述信息.

2.description方法默認(rèn)返回對象的描述信息(默認(rèn)實(shí)現(xiàn)是返回類名和對象的內(nèi)存地址)

3.description方法是基類NSObject 所帶的方法,因?yàn)槠淠J(rèn)實(shí)現(xiàn)是返回類名和對象的內(nèi)存地址, 這樣的話,使用NSLog輸出OC對象,意義就不是很大,因?yàn)槲覀儾⒉魂P(guān)心對象的內(nèi)存地址,比較關(guān)心的是對象內(nèi)部的一些成變量的值。因此,會經(jīng)常重寫description方法,覆蓋description方法 的默認(rèn)實(shí)現(xiàn)

description重寫的方法

/**對象方法:當(dāng)使用NSLog輸出該類的實(shí)例對象的時候調(diào)用*/

-(NSString *) description

{

return [NSString stringWithFormat:@"狗腿數(shù):%d,狗眼數(shù)%d\n",_legNum,_eyeNum];

}

/**類方法:當(dāng)使用NSLog輸出該類的類對象的時候調(diào)用*/

+(NSString *) description

{

return @"+開頭的description方法";

}

description陷阱

1.千萬不要在description方法中同時使用%@和self,下面的寫法是錯誤的

- (NSString *)description {

return [NSString stringWithFormat:@"%@", self];

};

2.同時使用了%@和self,代表要調(diào)用self的description方法,因此最終會導(dǎo)致程序陷入死循環(huán),循 環(huán)調(diào)用description方法;

3.當(dāng)[NSString stringWithFormat:@“%@”, self]; 使用它時,循壞調(diào)用,導(dǎo)致系統(tǒng)會發(fā)生運(yùn)行時錯誤;

4.當(dāng)該方法使用NSLog(“%@”,self) 時候, 系統(tǒng)做了相關(guān)的優(yōu)化,循壞調(diào)用3次后就會自動退出.

? @interface?LaoShiEr :?NSObject

@property?(nonatomic,?copy,?readonly)?NSString?*name;

@property?(nonatomic,?copy,?readonly)?NSString?*work;

- (id)initWithName:(NSString?*)name

????????????? work:(NSString?*)work;

@end

@implementation?LaoShiEr

- (id)initWithName:(NSString?*)name

????????????? work:(NSString?*)work

{

????if?((self?= [superinit])) {

????????_name?= [name?copy];

????????_work?= [work?copy];

??? }

????return?self;

}

- (NSString?*)description

{

????return?[NSStringstringWithFormat:@"<%@ : %p,\"%@ %@\">",[selfclass],self,_name,_work];

}

@end

按照上面的代碼來寫,輸出如下信息

LaoShiEr?*laoshi = [[LaoShiEralloc]

????????????????????????initWithName:@"laoshier"

????????????????????????work:@"coder"];

????NSLog(@"laoshier = %@",laoshi);

laoshier = <LaoShiEr : 0xb64bec0,"laoshier coder">

這樣就比之前所輸出得信息更加清楚了,也更為有用了。再description中輸出很多互不相同的信息的時候可以借助NSDictionary類的description方法。修改一下老師兒的description方法

- (NSString?*)description

{

????return?[NSStringstringWithFormat:@"<%@ : %p, %@>",[selfclass],self,@{@"name":_name,@"work":_work}];

}

再此輸出

laoshier = <LaoShiEr : 0xb677420, {

??? name = laoshier;

??? work = coder;

}>

debugDescription方法是開發(fā)者在調(diào)試器中以控制臺命令打印對象時才調(diào)用的。在NSObject類的默認(rèn)實(shí)現(xiàn)中,此方法只是直接調(diào)用了description。以LaoShiEr為例,我們在創(chuàng)建實(shí)例所用的代碼后面插入斷點(diǎn),然后通過調(diào)試器運(yùn)行程序,暫停于此:并且po完成對象打印:

<LaoShiEr : 0xb7c4310, {

??? name = laoshier;

??? work = coder;

}>

當(dāng)你不想把類名與指針地址這種額外內(nèi)容放在普通的描述信息里,但是卻希望調(diào)試的時候能夠很方便地看到它們,在此情況下,就可以使用這種輸出方式來實(shí)現(xiàn)。

- (NSString?*)description

{

????return?[NSStringstringWithFormat:@"<%@>",@{@"name":_name,@"work":_work}];

}

- (NSString?*)debugDescription

{

????return?[NSStringstringWithFormat:@"<%@ : %p, %@>",[selfclass],self,@{@"name":_name,@"work":_work}];

}



?

總結(jié)

以上是生活随笔為你收集整理的NSObject协议中方法:description 和 debugDescription的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。