Objective-C Category的妙用

? ? ? ? ?

(一)覆蓋主類的方法實(shí)現(xiàn)

? XMPP的IPV6適配

蘋果要適配IPV6(only)了,查了一下網(wǎng)上的方法,基本上是在GCDAsyncSocket中改動。這樣有個缺點(diǎn);庫更新的時候之前的改動失效痪蝇。而且一般不建議在第三庫里面改鄙陡。剛好GCDAsyncSocket的的原方法是直接調(diào)用另一個方法。

上代碼:


#import "GCDAsyncSocket+ECBIPV6.h"

#import "ECBIPV6SocketTransfer.h"

@implementation GCDAsyncSocket (ECBIPV6)

-(BOOL)connectToHost:(NSString *)host onPort:(uint16_t)port error:(NSError *__autoreleasing *)errPtr

{

//地址轉(zhuǎn)換躏啰,代碼就不貼了

NSString *newhost=[ECBIPV6SocketTransfer convertHostToAddress:host];

return? [self connectToHost:newhost onPort:port withTimeout:-1 error:errPtr];

}

@end


GCDAsyncSocket的原方法:

- (BOOL)connectToHost:(NSString*)host onPort:(uint16_t)port error:(NSError **)errPtr

{

return [self connectToHost:host onPort:port withTimeout:-1 error:errPtr];

}


? category覆蓋主類方法切記要注意的一點(diǎn)是趁矾,不管有沒有導(dǎo)入頭文件,都會覆蓋主類的方法给僵。具體原因這里不展開說毫捣,如要詳細(xì)了解,請看雷純鋒的博客:Objective-C Category 的實(shí)現(xiàn)原理

(二)使用protocol調(diào)用類的隱藏方法

NSobject+YYModel的以其人之道還治其人之身

? 之前一直在用YYModel的+ (NSArray *)modelArrayWithClass:(Class)cls array:(NSArray *)arr方法想际,后來項(xiàng)目中導(dǎo)入了YYKit就把YYModel刪了培漏,直接用YYkit中的NSobject+YYModel。蛋疼的是頭文件里只公開了+ (NSArray *)modelArrayWithClass:(Class)cls json:(id)json胡本。所以用的時候把a(bǔ)rray轉(zhuǎn)換成json再調(diào)用牌柄。但是方法實(shí)現(xiàn)里卻是+ (NSArray *)modelArrayWithClass:(Class)cls json:(id)json將json轉(zhuǎn)化成array再調(diào)用+ (NSArray *)modelArrayWithClass:(Class)cls array:(NSArray *)arr。侧甫。珊佣。。披粟,是不是大寫的懵逼咒锻。

? 當(dāng)然最簡單的方法是直接將+ (NSArray *)modelArrayWithClass:(Class)cls array:(NSArray *)arr放在頭文件中,但是秉著不改第三方庫的原則守屉,我并沒有這樣做惑艇。?

? 往深處說,其實(shí)OC中沒有隱藏方法拇泛,使用蠻力一樣能調(diào)用頭文件沒有公開的方法滨巴。但這樣一點(diǎn)都不能體現(xiàn)文章的主題:妙用。俺叭。恭取。

?YYModel中有個適配屬性鍵值得方法:+ (NSDictionary *)modelCustomPropertyMapper,這個方法并不要求寫在頭文件中熄守◎诳澹看了源代碼才發(fā)現(xiàn),作者在NSObject分類中定義了一個協(xié)議:


@protocol YYModel

@optional

+ (nullable NSDictionary*)modelCustomPropertyMapper;


看到這里裕照,似乎明白什么了攒发,我馬上也在NSArray,NSDictionary的分類中定義了一個協(xié)議并遵循它

貼出NSArray+ECB.h中的部分代碼


@protocol ECBYYModelArrayProtocol

@optional

+ (NSArray *)modelArrayWithClass:(Class)cls array:(NSArray *)arr;

@end

@interface NSArray (ECB)<ECBYYModelArrayProtocol>

+(NSArray*)yy_modelArrayWithClass:(Class)cls array:(NSArray*)listArray;



NSArray+ECB.m中的實(shí)現(xiàn)

+(NSArray*)yy_modelArrayWithClass:(Class)cls array:(NSArray*)listArray

{

return [NSArray modelArrayWithClass:cls array:listArray ];

}


ps:這條后來看下基本沒什么用

直接在分類頭文件中聲明方法也行,不好意思




(三)使用運(yùn)行時重新定義容器的debugDescription

當(dāng)數(shù)組中元素是OC對象的時候晋南,NSLog或斷點(diǎn)Debug用po輸出的時候晨继,顯示的只有類名和地址。

如果想看到每個元素的屬性和屬性值搬俊,可以在分類中實(shí)現(xiàn)debugDescription或Description

這里就要用到運(yùn)行時遍歷對象的屬性

代碼如下:

- (NSString *)debugDescription

{

__block NSString *debugstring = @"";

[self enumerateObjectsUsingBlock:^(id? _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

unsigned int outCount, i;

objc_property_t *properties = class_copyPropertyList([obj class], &outCount);

NSMutableDictionary *dict =[NSMutableDictionary dictionary];

? ? for (i = 0; i<outCount;i++){

? ? objc_property_t property = properties[i];

? ?const char* char_f =property_getName(property);

? NSString *propertyName = [NSString stringWithUTF8String:char_f];

? id propertyValue = [obj valueForKey:propertyName];

? if (propertyValue) [dict setObject:propertyValue forKey:propertyName ];

? ? }

?free(properties);

debugstring =[debugstring stringByAppendingString:[NSString stringWithFormat:@"%lu,<%@,%p>,%@\n\n",idx,[obj class],&obj,dict]];

}];

return debugstring;

}


測試效果如下:











最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末紊扬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子唉擂,更是在濱河造成了極大的恐慌餐屎,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玩祟,死亡現(xiàn)場離奇詭異腹缩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)空扎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進(jìn)店門藏鹊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人转锈,你說我怎么就攤上這事盘寡。” “怎么了撮慨?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵竿痰,是天一觀的道長。 經(jīng)常有香客問我砌溺,道長影涉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任规伐,我火速辦了婚禮蟹倾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘猖闪。我一直安慰自己鲜棠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布萧朝。 她就那樣靜靜地躺著岔留,像睡著了一般。 火紅的嫁衣襯著肌膚如雪检柬。 梳的紋絲不亂的頭發(fā)上献联,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機(jī)與錄音何址,去河邊找鬼里逆。 笑死,一個胖子當(dāng)著我的面吹牛用爪,可吹牛的內(nèi)容都是我干的原押。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼偎血,長吁一口氣:“原來是場噩夢啊……” “哼诸衔!你這毒婦竟也來了盯漂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤笨农,失蹤者是張志新(化名)和其女友劉穎就缆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谒亦,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡竭宰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了份招。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片切揭。...
    茶點(diǎn)故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖锁摔,靈堂內(nèi)的尸體忽然破棺而出廓旬,到底是詐尸還是另有隱情,我是刑警寧澤鄙漏,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布嗤谚,位于F島的核電站,受9級特大地震影響怔蚌,放射性物質(zhì)發(fā)生泄漏巩步。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一桦踊、第九天 我趴在偏房一處隱蔽的房頂上張望椅野。 院中可真熱鬧,春花似錦籍胯、人聲如沸竟闪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炼蛤。三九已至,卻和暖如春蝶涩,著一層夾襖步出監(jiān)牢的瞬間理朋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工绿聘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嗽上,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓熄攘,卻偏偏與公主長得像兽愤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容