您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“OC Rumtime中IMP函數(shù)調(diào)用的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“OC Rumtime中IMP函數(shù)調(diào)用的示例分析”這篇文章吧。
OC 運(yùn)行時(shí)(runtime),測(cè)試了一個(gè)函數(shù)class_replaceMethod,具體如下:
IMP originalMethod; NSString *CustomUppercaseString(id SELF,SEL _CMD){ NSLog(@"BeginConverting。。。"); NSString *result=originalMethod(SELF,_CMD); NSLog(@"EndConverting。。。"); return result; }
Implementation中:
- (void)runtimeTest{ originalMethod=[NSString instanceMethodForSelector:@selector(uppercaseString)]; class_replaceMethod([NSString class], @selector(uppercaseString), (IMP)MyUppercaseString,NULL); NSString *s=@"zhang lei"; NSLog(@"uppercase:%@",[s uppercaseString]); }
運(yùn)行過(guò)程中在下面這行報(bào)錯(cuò):
NSString *result=originalMethod(SELF,_CMD);
①先是提示參數(shù)太多,問(wèn)百度說(shuō)是IMP本身包含了self和_cmd倆參數(shù),不用再顯示傳參。去掉參數(shù)后繼續(xù)報(bào)錯(cuò)。
②提示在A(yíng)RC下無(wú)法將void *轉(zhuǎn)換為id。關(guān)閉ARC后依舊出錯(cuò),還是無(wú)法轉(zhuǎn)換。
當(dāng)我查看IMP的定義時(shí)發(fā)現(xiàn)了這個(gè):
/// A pointer to the function of a method implementation. #if !OBJC_OLD_DISPATCH_PROTOTYPES typedef void (*IMP)(void /* id, SEL, ... */ ); #else typedef id (*IMP)(id, SEL, ...); #endif
報(bào)錯(cuò)的主要原因是因?yàn)镮MP取的是if中的定義,返回void *,于是懷疑項(xiàng)目編譯設(shè)置上設(shè)置的不對(duì)。繼續(xù)搜百度找到如下內(nèi)容:
“使用XCode6.X的小伙伴們要特別注意了,需要先到項(xiàng)目的構(gòu)建設(shè)置里面把Apple LLVM 6.0 - Preprocessing 的Enable Strict Checking of objc_msgSend Calls 選項(xiàng)設(shè)置為NO,否則result = imp(clazz, sel);會(huì)報(bào)錯(cuò)的?。 ?/p>
于是按照上面說(shuō)的進(jìn)行了設(shè)置,運(yùn)行成功。并且經(jīng)過(guò)調(diào)試,發(fā)現(xiàn)確實(shí)是Enable Strict Checking of objc_msgSend Calls控制著OBJC_OLD_DISPATCH_PROTOTYPES的取值。
以上是“OC Rumtime中IMP函數(shù)調(diào)用的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。