溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

OC Rumtime中IMP函數(shù)調(diào)用的示例分析

發(fā)布時(shí)間:2021-10-21 14:07:09 來(lái)源:億速云 閱讀:230 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要為大家展示了“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è)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI