亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

性能選擇器可能會導致泄漏,因為它的選擇器是未知的。

性能選擇器可能會導致泄漏,因為它的選擇器是未知的。

iOS
PIPIONE 2019-06-18 10:04:36
性能選擇器可能會導致泄漏,因為它的選擇器是未知的。ARC編譯器警告我如下:"performSelector may cause a leak because its selector is unknown".我要做的是:[_controller performSelector:NSSelectorFromString(@"someMethod")];為什么我會收到這樣的警告?我知道編譯器不能檢查選擇器是否存在,但是為什么會導致泄漏呢?我怎樣才能更改我的代碼,使我不再收到這個警告呢?
查看完整描述

3 回答

?
LEATH

TA貢獻1936條經驗 獲得超7個贊

在Xcode 4.2中的LLVM3.0編譯器中,可以按照以下方式抑制警告:

#pragma clang diagnostic push#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    [self.ticketTarget performSelector: self.ticketAction withObject: self];#pragma clang diagnostic pop

如果在多個地方都有錯誤,并且希望使用C宏系統來隱藏實用程序,則可以定義宏以使其更容易地抑制警告:

#define SuppressPerformSelectorLeakWarning(Stuff) \    do { \        _Pragma("clang diagnostic push") \        
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \        
Stuff; \        _Pragma("clang diagnostic pop") \    } while (0)

您可以使用這樣的宏:

SuppressPerformSelectorLeakWarning(
    [_target performSelector:_action withObject:self]);

如果需要執行消息的結果,可以這樣做:

id result;SuppressPerformSelectorLeakWarning(
    result = [_target performSelector:_action withObject:self]);


查看完整回答
反對 回復 2019-06-18
?
絕地無雙

TA貢獻1946條經驗 獲得超4個贊

我對此的猜測是:由于編譯器不知道選擇器,ARC無法強制執行正確的內存管理。

實際上,有時內存管理通過特定約定綁定到方法的名稱。具體來說,我在想方便建設者對決制作,使方法;前者按約定返回一個自動釋放的對象;后者是一個保留的對象。約定基于選擇器的名稱,因此如果編譯器不知道選擇器,那么它就不能強制執行正確的內存管理規則。

如果這是正確的,我認為您可以安全地使用您的代碼,前提是確保內存管理一切正常(例如,您的方法不返回它們分配的對象)。


查看完整回答
反對 回復 2019-06-18
  • 3 回答
  • 0 關注
  • 395 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號