19

私は次のような単純なボタンクラスを書いています:

@interface MyButton : NSObject {
  id object;
  SEL action;
}
@property(strong) id object;
@property SEL action;
-(void)fire;
@end


@implementation MyButton

@synthesize object, action;

-(void)fire {
  [object performSelector:action];
}

@end

Clangから次の警告が表示され[object performSelector:action]ます:

PerformSelector may cause a leak because its selector is unknown

いくつかの調査の結果、セレクターは異なるメモリ要件を持つファミリに属する​​ことができることがわかりました。アクションが無効に戻ることを目的としているため、ARCに問題が発生することはなく、none家族に適している必要があります。

私が欲しいプリプロセッサコードの関連部分は、次のように見えます。

__attribute__((objc_method_family(none)))

しかし、Clangに心配しないように伝えるために、どこにそれを置くのでしょうか?

4

4 に答える 4

17

を動的に割り当てているためaction、コンパイラはARCでリークが発生する可能性があることを確認します。将来的には、LLVMコンパイラで警告を抑制できるようになる可能性があります。それまでは、のobjc_msgSend()代わりにランタイムを使用することで警告を回避できます-performSelector:

まず、ランタイムメッセージヘッダーをインポートします

#import <objc/message.h>
次に、に置き換えperformSelector:ますobjc_msgSend()

    // [object performSelector:action];
    objc_msgSend(object, action);
于 2011-08-16T05:18:30.837 に答える
9

Xcode4.2のLLVM3.0コンパイラでは、次のように警告を抑制できます。

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    [object performSelector:action];
#pragma clang diagnostic pop

答えをくれたScottThompson(この同様の質問について:performSelectorは、セレクターが不明であるため、リークを引き起こす可能性があります)に感謝します。

于 2012-03-16T10:15:35.813 に答える
5

新しいコードを作成している場合、コールバックを処理する最善の方法はブロックを使用することです。それらは performSelector よりも安全で柔軟です。http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.htmlを参照してください。

于 2011-08-13T05:24:35.403 に答える
1

私はこれを使用します:

[object tryToPerform:action with:nil];
于 2012-06-30T00:32:00.990 に答える