如何解決使用ARC后出現(xiàn)的PerformSelector may cause a leak because its selector is unknown

轉(zhuǎn)自:https://blog.csdn.net/majiakun1/article/details/46424925

如何解決使用ARC后出現(xiàn)的PerformSelector may cause a leak because its selector is unknown

問(wèn)題描述

項(xiàng)目中使用到了從字符串創(chuàng)建選擇器,編譯時(shí)發(fā)現(xiàn)警告:"performSelector may cause a leak because its selector is unknown"(因?yàn)閜erformSelector的選擇器未知可能會(huì)引起泄漏)个从,為什么在ARC模式下會(huì)出現(xiàn)這個(gè)警告痕惋?

經(jīng)過(guò)搜索后碟贾,在Stackoverflow上發(fā)現(xiàn)了一個(gè)令人滿意的答案仇矾。見(jiàn)http://stackoverflow.com/questions/7017281/performselector-may-cause-a-leak-because-its-selector-is-unknown织咧。

原因

在ARC模式下八秃,運(yùn)行時(shí)需要知道如何處理你正在調(diào)用的方法的返回值薛闪。這個(gè)返回值可以是任意值迁霎,如 void,int,char,NSString,id等等冈爹。ARC通過(guò)頭文件的函數(shù)定義來(lái)得到這些信息。所以平時(shí)我們用到的靜態(tài)選擇器就不會(huì)出現(xiàn)這個(gè)警告欧引。因?yàn)樵诰幾g期間频伤,這些信息都已經(jīng)確定。

如:


[someController performSelector:@selector(someMethod)];

- (void)someMethod

{

  //bla bla...

}

而使用[someController performSelector: NSSelectorFromString(@"someMethod")];時(shí)ARC并不知道該方法的返回值是什么芝此,以及該如何處理憋肖?該忽略因痛?還是標(biāo)記為ns_returns_retained還是ns_returns_autoreleased?

解決辦法

1.使用函數(shù)指針?lè)绞?/p>


SEL selector = NSSelectorFromString(@"someMethod");

IMP imp = [_controller methodForSelector:selector];

void (*func)(id, SEL) = (void *)imp;

func(_controller, selector);

當(dāng)有額外參數(shù)時(shí),如


SEL selector = NSSelectorFromString(@"processRegion:ofView:");

IMP imp = [_controller methodForSelector:selector];

CGRect (*func)(id, SEL, CGRect, UIView *) = (void *)imp;

CGRect result = func(_controller, selector, someRect, someView);

2.使用宏忽略警告


#pragma clang diagnostic push

#pragma clang diagnostic ignored "-Warc-performSelector-leaks"

  [someController performSelector: NSSelectorFromString(@"someMethod")]

#pragma clang diagnostic pop

通過(guò)使用#pragma clang diagnostic push/pop岸更,你可以告訴Clang編譯器僅僅為某一特定部分的代碼來(lái)忽視特定警告鸵膏。

如果需要忽視的警告有多處,可以定義一個(gè)宏


#define SuppressPerformSelectorLeakWarning(Stuff) \

    do { \

        _Pragma("clang diagnostic push") \

        _Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \

        Stuff; \

        _Pragma("clang diagnostic pop") \

    } while (0)

在產(chǎn)生警告也就是performSelector的地方用使用該宏怎炊,如


SuppressPerformSelectorLeakWarning(

    [_target performSelector:_action withObject:self]

);

如果需要performSelector返回值的話谭企,


id result;

SuppressPerformSelectorLeakWarning(

    result = [_target performSelector:_action withObject:self]

);

3.使用afterDelay


[self performSelector:aSelector withObject:nil afterDelay:0.0];   

如果在接受范圍內(nèi),允許在下一個(gè)runloop執(zhí)行评肆,可以這么做债查。xCode5沒(méi)問(wèn)題,但據(jù)反映瓜挽,xCode6的話這個(gè)不能消除警告盹廷。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市久橙,隨后出現(xiàn)的幾起案子俄占,更是在濱河造成了極大的恐慌,老刑警劉巖淆衷,帶你破解...
    沈念sama閱讀 212,599評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缸榄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡祝拯,警方通過(guò)查閱死者的電腦和手機(jī)碰凶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鹿驼,“玉大人欲低,你說(shuō)我怎么就攤上這事⌒笪” “怎么了砾莱?”我有些...
    開(kāi)封第一講書人閱讀 158,084評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)凄鼻。 經(jīng)常有香客問(wèn)我腊瑟,道長(zhǎng),這世上最難降的妖魔是什么块蚌? 我笑而不...
    開(kāi)封第一講書人閱讀 56,708評(píng)論 1 284
  • 正文 為了忘掉前任闰非,我火速辦了婚禮,結(jié)果婚禮上峭范,老公的妹妹穿的比我還像新娘财松。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布辆毡。 她就那樣靜靜地躺著菜秦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舶掖。 梳的紋絲不亂的頭發(fā)上球昨,一...
    開(kāi)封第一講書人閱讀 50,021評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音眨攘,去河邊找鬼主慰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鲫售,可吹牛的內(nèi)容都是我干的共螺。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼龟虎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了沙庐?” 一聲冷哼從身側(cè)響起鲤妥,我...
    開(kāi)封第一講書人閱讀 37,866評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拱雏,沒(méi)想到半個(gè)月后棉安,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铸抑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評(píng)論 2 327
  • 正文 我和宋清朗相戀三年贡耽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹊汛。...
    茶點(diǎn)故事閱讀 38,768評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒲赂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出刁憋,到底是詐尸還是另有隱情滥嘴,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評(píng)論 4 333
  • 正文 年R本政府宣布至耻,位于F島的核電站若皱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尘颓。R本人自食惡果不足惜走触,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疤苹。 院中可真熱鬧互广,春花似錦、人聲如沸卧土。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,850評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至逸吵,卻和暖如春凶硅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扫皱。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,082評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工足绅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人韩脑。 一個(gè)月前我還...
    沈念sama閱讀 46,571評(píng)論 2 362
  • 正文 我出身青樓氢妈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親段多。 傳聞我的和親對(duì)象是個(gè)殘疾皇子首量,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容