91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

OC Rumtime中IMP函數調用的示例分析

發布時間:2021-10-21 14:07:09 來源:億速云 閱讀:238 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“OC Rumtime中IMP函數調用的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“OC Rumtime中IMP函數調用的示例分析”這篇文章吧。

        OC 運行時(runtime),測試了一個函數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]);
}

運行過程中在下面這行報錯:

NSString *result=originalMethod(SELF,_CMD);

①先是提示參數太多,問百度說是IMP本身包含了self和_cmd倆參數,不用再顯示傳參。去掉參數后繼續報錯。

②提示在ARC下無法將void *轉換為id。關閉ARC后依舊出錯,還是無法轉換。

        當我查看IMP的定義時發現了這個:

/// 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

報錯的主要原因是因為IMP取的是if中的定義,返回void *,于是懷疑項目編譯設置上設置的不對。繼續搜百度找到如下內容:

“使用XCode6.X的小伙伴們要特別注意了,需要先到項目的構建設置里面把Apple LLVM 6.0 - Preprocessing 的Enable Strict Checking of objc_msgSend Calls 選項設置為NO,否則result = imp(clazz, sel);會報錯的!!”

于是按照上面說的進行了設置,運行成功。并且經過調試,發現確實是Enable Strict Checking of objc_msgSend Calls控制著OBJC_OLD_DISPATCH_PROTOTYPES的取值。

以上是“OC Rumtime中IMP函數調用的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

周口市| 惠安县| 封丘县| 沧源| 屏山县| 恩平市| 通辽市| 高要市| 康马县| 灵山县| 富民县| 开封市| 龙江县| 巧家县| 汉阴县| 桂东县| 阳山县| 越西县| 张掖市| 扎赉特旗| 吉安市| 乐都县| 屏南县| 抚宁县| 巩留县| 安阳市| 舞钢市| 天峨县| 正安县| 高陵县| 肥东县| 涿鹿县| 泾阳县| 永春县| 铅山县| 广元市| 巢湖市| 余姚市| 太谷县| 大英县| 孙吴县|