2015-10-16 54 views
0

我有一種情況,我想調用執行選擇器提供錯誤的目標上的方法:PerformSelector may cause a leak because its selector is unknown執行選擇器可能會導致泄漏解決方法快速崩潰

爲了避開這個我使用從this SO question優秀的解決方案:

if (self.target) { 
    IMP imp = [self.target methodForSelector:self.selector]; 
    void (*func)(id, SEL, id) = (void *)imp; 
    func(self.target, self.selector, argument); 
} 

下面這段代碼是我使用的斯威夫特項目框架的一部分,它是導致飛機墜毀。

如果我忽略警告並使用[self.target performSelector:self.selector withObject:self.argument];它工作正常。

所以... 我假設這是基本Swift與Objective-C消息發送體系結構。請有人告訴我a)發生了什麼事? b)如何繞過它。

+0

在雨燕2.0你可以直接調用'performSelector'。 – matt

+0

該框架僅在Objective-C中。 swift是利用這個框架的項目。 –

+0

好吧,我想我已經回答了這個問題,因爲你回答了這些問題。你有一個可行的方法,所以我現在甚至都沒有看到這個問題到底是什麼。 – matt

回答

1

最直接的方法來發送消息(假設它需要一個對象參數,並且沒有返回)是:

void (*func)(id, SEL, id) = (void (*)(id, SEL, id))objc_msgSend; 
func(self.target, self.selector, self.argument); 
+0

完美的作品謝謝你!我在做什麼和這段代碼有什麼區別?我假設我的代碼向該方法的目標請求,而在這裏你使用'objc_msgSeng'單獨構建它?再次感謝! –

0

If I ignore the warnings and use [self.target performSelector:self.selector withObject:self.argument]; It works fine.

那麼我的建議就是壓制警告,然後打電話給performSelector:...

+0

您引用的問題有答案,告訴您如何取消警告。 – matt

+0

我並不是僅僅抑制警告的忠實粉絲。 –

+0

好吧,我確實給出了另一個解決方法,它可以讓編譯器停止警告你,而不會人爲地壓制它。 – matt

相關問題