亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS中實現檢測Zoombie對象的具體方法

2020-07-26 02:33:08
字體:
來源:轉載
供稿:網友

前言

我們大家都知道,如果在XCode中開啟了Zoombie Objects。如圖。

那么在一個對象釋放后,再次給該對象發送消息,在Xcode控制臺中,可看到如下打印信息。這些信息可以幫助我們定位問題。

ZoombieDemo[12275:2841478] *** -[Test test]: message sent to deallocated instance 0x60800000b000

那么究竟XCode是如何實現僵尸對象的檢查的,我們將來一一揭曉。

實現原理

在《Effective Objective-C 》一書中有提到過僵尸指針的實現方式。

通過hook NSObject的dealloc的方法,在一個對象要釋放的時候,通過objcduplicateClass復制NSZombie類,生成NSZombieOriginaClass,并且將當前對象的isa指向新生成的類。這塊內存不會釋放。

因為在給該對象發消息時,NSZombieOriginaClass并未實現原有類的方法,所以會走完整的消息轉發。所以我們能取出具體的OriginaClass(去掉NS_Zombie),當前sel,打印出來。

[class seletor]:message sent to deallocated instance 0x22909"

簡單來說,就是將對象指向一個新的類,因為新類里面并沒有原有類方法的實現,所以必定會走到消息轉發中。

以上說的是動態生成新的類,類名是通過固定前綴拼接而成,將isa指向該類。其實還有一種方式,就是指向固定的類,原有類名通過關聯對象的方式來存儲。

既然知道了原理,可以動手實現一下。

動手實現

首先是hook dealloc方法。在NSObject+HookDealloc中實現。

+ (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{  Class class = [self class];  SEL originalSelector = NSSelectorFromString(@"dealloc");  SEL swizzledSelector = @selector(swizzledDealloc);  Method originalMethod = class_getInstanceMethod(class, originalSelector);  Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);    BOOL success = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));  if (success) {   class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));  } else {   method_exchangeImplementations(originalMethod, swizzledMethod);  } });}

動態生成新的類

在swizzledDealloc中,我們通過"Zoombie_"拼接原始類名,得到一個新的類名。然后生成該類,添加 forwardingTargetForSelector的實現。便于在消息轉發的時候得到調用信息。

NSString *Zoombie_Class_Prefix = @"Zoombie_";// 指向動態生成的類,用Zoombie拼接原有類名NSString *className = NSStringFromClass([self class]);NSString *zombieClassName = [Zoombie_Class_Prefix stringByAppendingString: className]; Class zombieClass = NSClassFromString(zombieClassName);if(zombieClass) return; zombieClass = objc_allocateClassPair([NSObject class], [zombieClassName UTF8String], 0); objc_registerClassPair(zombieClass);class_addMethod([zombieClass class], @selector(forwardingTargetForSelector:), (IMP)forwardingTargetForSelector, "@@:@");object_setClass(self, zombieClass);

forwardingTargetForSelector的方法實現,原始類名,去掉前綴即可得到。因為這里已經是調用到已釋放對象的方法,我們直接abort掉,程序將崩潰。

id forwardingTargetForSelector(id self, SEL _cmd, SEL aSelector) { NSString *className = NSStringFromClass([self class]); NSString *realClass = [className stringByReplacingOccurrencesOfString:Zoombie_Class_Prefix withString:@""]; NSLog(@"[%@ %@] message sent to deallocated instance %@", realClass, NSStringFromSelector(aSelector), self); abort();}

指向固定類

指向已有的ZoombieObject類,類名存在關聯對象中。

 // 指向固定的類,原有類名存儲在關聯對象中NSString *originClassName = NSStringFromClass([self class]);objc_setAssociatedObject(self, "OrigClassNameKey", originClassName, OBJC_ASSOCIATION_COPY_NONATOMIC);object_setClass(self, [ZoombieObject class]);

同上,在ZoombieObject中實現forwardingTargetForSelector方法,可以得到調用信息。原始類名通過關聯對象獲取。

- (id)forwardingTargetForSelector:(SEL)aSelector { NSLog(@"[%@ %@] message sent to deallocated instance %@", objc_getAssociatedObject(self, "OrigClassNameKey"), NSStringFromSelector(aSelector), self); abort();}

forwardingTargetForSelector是消息轉發的第二步,我們也可以不在這里處理,等到最后一步forwardInvocation,不過要生成方法簽名,要略微復雜些。

要想走到forwardInvocation,methodSignatureForSelector返回不能是空。這里我們返回了StubProxy類中stub的方法簽名(已經定義好的類和方法),最后就回走到forwardInvocation,通過invocation.selector可得到當前調用方法名。通過關聯對象獲取到原始類名。

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { NSMethodSignature *sig = [super methodSignatureForSelector:aSelector]; if (!sig) {  sig = [StubProxy instanceMethodSignatureForSelector:@selector(stub)]; }  return sig;}- (void)forwardInvocation:(NSInvocation *)anInvocation { NSLog(@"[%@ %@] message sent to deallocated instance %@", objc_getAssociatedObject(self, "OrigClassNameKey"), NSStringFromSelector(anInvocation.selector), self);}

這樣,一個簡單的檢測僵尸指針的方案就實現了。

demo在此。

兩種方式都實現了,可通過調整NSObject+HookDealloc中,swizzledSelector的值來切換。my_dealloc是指向動態類,swizzledDealloc是指向固定類。

SEL swizzledSelector = @selector(my_dealloc);

在App運行起來后,點擊button,即可觸發。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
伊人久久综合97精品| 日韩欧美中文第一页| 亚洲国产精品专区久久| 91精品国产沙发| 91精品久久久久久久久久入口| 国产最新精品视频| 92裸体在线视频网站| 国产欧美日韩免费看aⅴ视频| 国产精自产拍久久久久久蜜| 日韩视频免费在线| 亚洲欧美日韩一区二区三区在线| 欧美大成色www永久网站婷| 中文字幕亚洲激情| 亚洲香蕉在线观看| 4k岛国日韩精品**专区| 性欧美办公室18xxxxhd| 日韩高清人体午夜| 亚洲一区美女视频在线观看免费| 日韩精品欧美激情| 亚洲黄色在线观看| 日韩av在线免费看| 日韩欧美在线视频日韩欧美在线视频| 欧美日韩成人精品| 欧美一区二三区| 欧美大片va欧美在线播放| 91久久精品久久国产性色也91| 国内外成人免费激情在线视频| 九色91av视频| 国产精品av在线播放| 欧美大尺度电影在线观看| 92版电视剧仙鹤神针在线观看| 欧美成人小视频| 91大神福利视频在线| 欧美激情国产精品| 精品伊人久久97| 欧美亚洲另类在线| 91久久久亚洲精品| 国产精品久久久久久一区二区| 久久久免费精品视频| 精品视频www| 欧美区二区三区| 国产亚洲欧美另类中文| 亚洲电影第1页| 亚洲欧美综合v| www国产亚洲精品久久网站| 欧美专区在线播放| 久久久久久中文| 97视频色精品| 亚洲男人天堂2019| 亚洲一区二区自拍| 中文字幕亚洲欧美日韩2019| 成人动漫网站在线观看| 国产91精品不卡视频| 亚洲国产精彩中文乱码av在线播放| 亚洲精品福利在线| 久久影视电视剧免费网站清宫辞电视| 亚洲理论电影网| 日韩国产精品一区| 亚洲激情视频在线观看| 亚洲成人黄色网| 亚洲欧美日韩中文视频| 日韩美女视频中文字幕| 日韩欧美中文第一页| 国产网站欧美日韩免费精品在线观看| 久久精品久久久久久国产 免费| 日韩av网址在线观看| 精品久久久久久久久久久久久久| 日韩视频―中文字幕| 亚洲国产成人久久| 亚洲最大中文字幕| 亚洲欧美成人在线| 国产精品高清免费在线观看| 国产精品吹潮在线观看| 亚洲视频日韩精品| 国产精品欧美一区二区三区奶水| 国产激情久久久久| 亚洲香蕉成人av网站在线观看| 91精品久久久久久综合乱菊| 日韩电影大全免费观看2023年上| 亚洲理论片在线观看| 欧美高清理论片| 国产一区二区黄| 色综合天天狠天天透天天伊人| 亚洲经典中文字幕| 欧美床上激情在线观看| 97视频在线播放| 日韩在线免费高清视频| 国产精品亚洲一区二区三区| 精品国产自在精品国产浪潮| 亚洲人成自拍网站| 久久久女女女女999久久| 国产精品极品美女在线观看免费| 精品亚洲va在线va天堂资源站| 97在线免费观看视频| 国产精品高潮呻吟视频| 2019中文字幕在线观看| 国产成人久久久精品一区| 欧美视频一区二区三区…| 免费99精品国产自在在线| 亚洲精品乱码久久久久久按摩观| 中文字幕亚洲综合久久筱田步美| 1769国产精品| 68精品久久久久久欧美| 美女视频黄免费的亚洲男人天堂| 久久精品一本久久99精品| 91精品国产乱码久久久久久蜜臀| 欧美成人性生活| 欧洲美女7788成人免费视频| 久久亚洲春色中文字幕| 亚洲2020天天堂在线观看| 日韩av黄色在线观看| 久久久久国产精品免费网站| 成人网欧美在线视频| 日韩在线免费av| 日韩亚洲精品电影| 中文字幕一区日韩电影| 亚洲精品网站在线播放gif| 色中色综合影院手机版在线观看| 国产成人激情视频| 亚洲国产日韩欧美在线图片| 国产一区av在线| 欧美日韩国产一区二区三区| 成人久久久久爱| 欧美激情精品久久久| 国产精品高清免费在线观看| 午夜精品久久久久久久99热浪潮| 欧美成人剧情片在线观看| 国产欧美精品在线播放| 亚洲人精选亚洲人成在线| 日韩中文有码在线视频| 91亚洲精华国产精华| 91久久久久久久久久| 国产精品日韩欧美| 久久久久久噜噜噜久久久精品| 2019最新中文字幕| 欧美猛交ⅹxxx乱大交视频| 欧美床上激情在线观看| 91情侣偷在线精品国产| 91精品国产色综合| 欧美高清videos高潮hd| 亚洲国产精品久久久| 91久久精品日日躁夜夜躁国产| 欧美午夜影院在线视频| 91在线高清视频| 日韩精品有码在线观看| 日韩中文字幕亚洲| 美女精品久久久| 91视频88av| 国产免费一区二区三区香蕉精| 久久夜色精品亚洲噜噜国产mv| 日韩精品视频在线播放| 国产成人精彩在线视频九色| 亚洲视频在线免费观看| 亚洲久久久久久久久久久| 欧美日韩国产中字| 久久国产精品视频| 美女啪啪无遮挡免费久久网站| 亚洲欧美综合图区| 羞羞色国产精品| 久久中文字幕视频| 日韩在线www| 久久亚洲欧美日韩精品专区| 日韩欧美在线播放| 日韩精品中文字幕在线|