image.png
這個(gè)提示的意思是如果你這樣用有可能會(huì)出現(xiàn)內(nèi)存泄漏案腺。
當(dāng)你想消除這個(gè)警告時(shí),你或者使用
方法一
IMP imp = [dobj methodForSelector:sel];
MyClass *(*func)(void) = (void *)imp;
MyClass *ret=func();
方法二
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[dobj performSelector:sel)];
#pragma clang diagnostic pop
其實(shí)這些方法都是治標(biāo)不治本袱箱。
原因
其實(shí)ARC編譯器在編譯這段代碼的時(shí)候登馒,例如函數(shù)的名通過后臺(tái)API返回,ARC是無法明確知道這個(gè)Selector的具體命名囚枪,如果有返回值側(cè)存在返回值泄漏的風(fēng)險(xiǎn)派诬,但不一定。
可能你會(huì)問:"什么链沼。默赂。。括勺。函數(shù)的名字是這么重要的嗎》缆八?"
可以明確的跟你說是的;
什么時(shí)候會(huì)出現(xiàn)泄漏呢疾捍?
當(dāng)你方法實(shí)現(xiàn)使用alloc奈辰,new,copy拾氓,mutableCopy作為前綴的時(shí)候并且?guī)в蟹祷刂档臅r(shí)候就有會(huì)出泄漏冯挎,否則安全;因?yàn)锳RC在編譯上述情況的幾行代碼時(shí)是沒有辦法知道你函數(shù)的真實(shí)名字的所以對(duì)返回值不調(diào)用release的.
總結(jié)
當(dāng)你方法實(shí)現(xiàn)帶有返回值并使用alloc,new房官,copy趾徽,mutableCopy命令時(shí),使用performSelector會(huì)導(dǎo)致泄漏翰守。