淺談ARC下hook"performSelector:withObject:"奔潰的原因

如果你嘗試hookperformSelector:withObject:swzzle該方法邑闺,你會發(fā)現(xiàn)一運行很快就會崩潰盒揉,爆出EXC_BAD_ACCESS野指針錯誤缆八。

下面上demo:

#import "NSObject+Hock.h"
#import <objc/runtime.h>

@implementation NSObject (Hock)

+ (void)swizzleInstanceSelector:(SEL)originalSelector withSwizzledInstanceSelector:(SEL)swizzledSelector
{
    Method originalMethod = class_getInstanceMethod(self, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(self, swizzledSelector);
    if (originalMethod && swizzledMethod) {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
       [self swizzleInstanceSelector:@selector(performSelector:withObject:) withSwizzledInstanceSelector:@selector(hook_performSelector:withObject:)];
    });
}

- (id)hook_performSelector:(SEL)aSelector withObject:(id)object {
    NSLog(@"------------hook: object:%@ aSelector:%@--------------",object,NSStringFromSelector(aSelector));
    return [self hook_performSelector:aSelector withObject:object];
}

最后一次打印的內(nèi)容是:

------------hook: object:<UIWindow: 0x7ffc0060a7e0; frame = (0 0; 375 667); autoresize = W+H; gestureRecognizers = <NSArray: 0x60000005bdb0>; layer = <UIWindowLayer: 0x600000030a00>> aSelector:setWindow:--------------

再往下走就崩潰了(黑人臉)0贰:蘖铩符衔!

先看看UIWindowsetWindow:方法找前,這個方法

AppDelegate.m 跑一下如下的代碼:

    SEL sel = NSSelectorFromString(@"setWindow:");
    NSMethodSignature *signature = [[self.window class] instanceMethodSignatureForSelector:sel];
    NSLog(@"%lu",(unsigned long)signature.methodReturnLength);
    NSLog(@"%s",signature.methodReturnType);

上面的代碼就是通過NSMethodSignature來確定方法是否有返回值以及返回值的類型是什么。

打印結(jié)果如下:

2017-xx-xx 16:48:28.675 Demo[7521:1127858] 0
2017-xx-xx 16:48:30.180 Demo[7521:1127858] (null)

可以看到setWindow:是沒有返回值的判族,崩潰關(guān)返回值什么事躺盛?是的,就是關(guān)返回值的事形帮。

ARC 環(huán)境下當(dāng)調(diào)用一個方法時槽惫,需要知道這個方法的返回值類型及返回值的接受者是誰,這也是ACR下能夠管理引用類型的一個重要因素辩撑。

在執(zhí)行 performSelector:withObject:方法時躯枢,該方法的返回值類型是id類型,而實際上selector方法的返回值有可能是void槐臀,如本例中的setWindow:锄蹂,也就是ARC不知道返回值是什么類型的。

在這種返回值是void的情況下水慨,ARC視圖返回一個值得糜,但是實際上沒有任何東西返回,當(dāng)強制這么干的時候就會造成野指針晰洒。要解決這個問題可以兼容到MRC朝抖,在MRC下會根據(jù)實際情況決定是否返回一個值。

怎么兼容MRC呢谍珊?前往 Build Phases > Compile Sources 給 NSObject+Hock.m 文件 加上-fno-objc-arc

再次運行治宣,It is work!

整個過程就是如上所示,這也是解決hookperformSelector:withObject:過程中可能奔潰的方法砌滞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末侮邀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贝润,更是在濱河造成了極大的恐慌绊茧,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件打掘,死亡現(xiàn)場離奇詭異华畏,居然都是意外死亡,警方通過查閱死者的電腦和手機尊蚁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門亡笑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人横朋,你說我怎么就攤上這事仑乌。” “怎么了崩泡?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵兵钮,是天一觀的道長田柔。 經(jīng)常有香客問我,道長压汪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任古瓤,我火速辦了婚禮止剖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘落君。我一直安慰自己穿香,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布绎速。 她就那樣靜靜地躺著皮获,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纹冤。 梳的紋絲不亂的頭發(fā)上洒宝,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音萌京,去河邊找鬼雁歌。 笑死,一個胖子當(dāng)著我的面吹牛知残,可吹牛的內(nèi)容都是我干的靠瞎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼求妹,長吁一口氣:“原來是場噩夢啊……” “哼乏盐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起制恍,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤丑勤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吧趣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體法竞,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年强挫,在試婚紗的時候發(fā)現(xiàn)自己被綠了岔霸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡俯渤,死狀恐怖呆细,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情八匠,我是刑警寧澤絮爷,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布趴酣,位于F島的核電站,受9級特大地震影響坑夯,放射性物質(zhì)發(fā)生泄漏岖寞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一柜蜈、第九天 我趴在偏房一處隱蔽的房頂上張望仗谆。 院中可真熱鬧,春花似錦淑履、人聲如沸隶垮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狸吞。三九已至,卻和暖如春指煎,著一層夾襖步出監(jiān)牢的瞬間捷绒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工贯要, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留暖侨,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓崇渗,卻偏偏與公主長得像字逗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宅广,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

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

  • ARC的本質(zhì) ARC是編譯器(時)特性葫掉,而不是運行時特性,更不是垃圾回收器(GC)跟狱。 Automatic Refe...
    成熱了閱讀 616評論 0 1
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,139評論 30 470
  • 多線程俭厚、特別是NSOperation 和 GCD 的內(nèi)部原理。運行時機制的原理和運用場景驶臊。SDWebImage的原...
    LZM輪回閱讀 2,007評論 0 12
  • 我們這一生要經(jīng)歷多少次悲歡離別? 考上大學(xué)離開家門奔向象牙塔的時候纵寝, 外出打工背井離鄉(xiāng)的時候论寨, 女兒閨中出嫁成為他...
    漠小北閱讀 912評論 0 0
  • 再想不到比這時候開始創(chuàng)作的更好時間了。生活中繁瑣的事情把時間榨干連雞肋都不留,我亦是被卷攜在這場了無生息的侵蝕中葬凳。...
    杰西婭閱讀 212評論 0 1