iOS的category你到底知道多少

關(guān)于分類在開發(fā)中我們都經(jīng)常常見,category在加上runtime能實現(xiàn)好多意想不到的效果谴轮,最近在學(xué)習(xí)中突然了解到category可以省下好多代碼末购。這對于是小白的我感覺 像打開了新天地殴胧。

最近在閱讀博客的時候,發(fā)現(xiàn)一篇文章挑宠,如何判斷數(shù)組越界的情況,如果一行一行的判斷寫颓影,不近費事費時各淀,還不一定所有的都能判斷到,但是如果在編譯的時候就替換系統(tǒng)的方法诡挂,這樣我們就不用逐個判斷了碎浇。

在說分類之前需要先了解一些load 和 initialize的區(qū)別

load:是在main函數(shù)調(diào)用之前就已經(jīng)加載的方法

initialize:是在main函數(shù)之后init方法之前加載的方法,主要進(jìn)行一些初始化的操作

此外還想在多說兩句璃俗,load加載類的時候奴璃,加載的順序是類,子類城豁,分類苟穆,注意如果有好多分類的時候,加載的順序是根據(jù)編譯的書序來判斷的唱星。有興趣的朋友可以詳細(xì)看一下分類雳旅。

而調(diào)用的時候順序正好相反,分類间聊,子類岭辣,類。分類如果實現(xiàn)了父類的方法甸饱,則會覆蓋掉父類的方法沦童。而load方法不會覆蓋。


下面進(jìn)入正題叹话,話不多說直接上代碼



+ (void)load{

? ? //替換objectAtIndex方法

? ? MethodfromMethod =class_getInstanceMethod(objc_getClass("__NSArrayI"),@selector(objectAtIndex:));

? ? MethodtoMethod =class_getInstanceMethod(objc_getClass("__NSArrayI"),@selector(wb_objectAtIndex:));

? ? method_exchangeImplementations(fromMethod, toMethod);


? ? //替換array【0】獲取元素的方法

? ? MethodfromMethod1 =class_getInstanceMethod(objc_getClass("__NSArrayI"),@selector(objectAtIndexedSubscript:));

? ? MethodtoMethod1 =class_getInstanceMethod(objc_getClass("__NSArrayI"),@selector(wb_objectAtIndexedSubscript:));

? ? method_exchangeImplementations(fromMethod1, toMethod1);



? ? //替換objectAtIndex方法

? ? MethodmfromMethod =class_getInstanceMethod(objc_getClass("__NSArrayM"),@selector(objectAtIndex:));

? ? MethodmtoMethod =class_getInstanceMethod(objc_getClass("__NSArrayM"),@selector(wb_mobjectAtIndex:));

? ? method_exchangeImplementations(mfromMethod, mtoMethod);


? ? //替換array【0】獲取元素的方法

? ? MethodmfromMethod1 =class_getInstanceMethod(objc_getClass("__NSArrayM"),@selector(objectAtIndexedSubscript:));

? ? MethodmtoMethod1 =class_getInstanceMethod(objc_getClass("__NSArrayM"),@selector(wb_mobjectAtIndexedSubscript:));

? ? method_exchangeImplementations(mfromMethod1, mtoMethod1);

}

-(id)wb_objectAtIndexedSubscript:(NSUInteger)index{

? ? if(self.count-1< index|| !self.count) {

? ? ? ? @try{

? ? ? ? ? ? return [self wb_objectAtIndexedSubscript:index];

? ? ? ? }@catch(NSException *exception) {

? ? ? ? ? ? // 在崩潰后會打印崩潰信息偷遗。如果是線上,可以在這里將崩潰信息發(fā)送到服務(wù)器

? ? ? ? ? ? NSLog(@"---------- %s Crash Because Method %s? ----------\n", class_getName(self.class), __func__);

? ? ? ? ? ? NSLog(@"%@",[exceptioncallStackSymbols]);

? ? ? ? ? ? returnnil;

? ? ? ? }@finally{

? ? ? ? }

? ? }else{

? ? ? ? return [self wb_objectAtIndexedSubscript:index];

? ? }

}

-(id)wb_objectAtIndex:(NSUInteger)index{

? ? if(self.count-1< index|| !self.count) {

? ? ? ? @try{

? ? ? ? ? ? return[selfwb_objectAtIndex:index];

? ? ? ? }@catch(NSException *exception) {

? ? ? ? ? ? // 在崩潰后會打印崩潰信息驼壶。如果是線上氏豌,可以在這里將崩潰信息發(fā)送到服務(wù)器

? ? ? ? ? ? NSLog(@"---------- %s Crash Because Method %s? ----------\n", class_getName(self.class), __func__);

? ? ? ? ? ? NSLog(@"%@",[exceptioncallStackSymbols]);

? ? ? ? ? ? returnnil;

? ? ? ? }@finally{

? ? ? ? }

? ? }else{

? ? ? ? return[selfwb_objectAtIndex:index];

? ? }

}

-(id)wb_mobjectAtIndexedSubscript:(NSUInteger)index{

? ? if(self.count-1< index) {

? ? ? ? @try{

? ? ? ? ? ? return [self wb_mobjectAtIndexedSubscript:index];

? ? ? ? }@catch(NSException *exception) {

? ? ? ? ? ? // 在崩潰后會打印崩潰信息。如果是線上热凹,可以在這里將崩潰信息發(fā)送到服務(wù)器

? ? ? ? ? ? NSLog(@"---------- %s Crash Because Method %s? ----------\n", class_getName(self.class), __func__);

? ? ? ? ? ? NSLog(@"%@",[exceptioncallStackSymbols]);

? ? ? ? ? ? returnnil;

? ? ? ? }@finally{

? ? ? ? }

? ? }else{

? ? ? ? return [self wb_mobjectAtIndexedSubscript:index];

? ? }





想深入了解的可以看一下這偏如果讓分類不覆蓋類方法:http://www.reibang.com/p/81291aceceb2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泵喘,一起剝皮案震驚了整個濱河市泪电,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纪铺,老刑警劉巖相速,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鲜锚,居然都是意外死亡突诬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門芜繁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旺隙,“玉大人,你說我怎么就攤上這事骏令∈呓荩” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵榔袋,是天一觀的道長抠刺。 經(jīng)常有香客問我,道長摘昌,這世上最難降的妖魔是什么速妖? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮聪黎,結(jié)果婚禮上罕容,老公的妹妹穿的比我還像新娘。我一直安慰自己稿饰,他們只是感情好锦秒,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喉镰,像睡著了一般旅择。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侣姆,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天生真,我揣著相機與錄音,去河邊找鬼捺宗。 笑死柱蟀,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蚜厉。 我是一名探鬼主播长已,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了术瓮?” 一聲冷哼從身側(cè)響起康聂,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胞四,沒想到半個月后恬汁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡撬讽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年蕊连,在試婚紗的時候發(fā)現(xiàn)自己被綠了悬垃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片游昼。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖尝蠕,靈堂內(nèi)的尸體忽然破棺而出烘豌,到底是詐尸還是另有隱情,我是刑警寧澤看彼,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布廊佩,位于F島的核電站,受9級特大地震影響靖榕,放射性物質(zhì)發(fā)生泄漏标锄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一茁计、第九天 我趴在偏房一處隱蔽的房頂上張望料皇。 院中可真熱鬧,春花似錦星压、人聲如沸践剂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逊脯。三九已至,卻和暖如春竣贪,著一層夾襖步出監(jiān)牢的瞬間军洼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工演怎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留歉眷,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓颤枪,卻偏偏與公主長得像汗捡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359