web-dev-qa-db-ja.com

Objective-Cのプロパティにブロックを保存する方法は?

後で使用するために、objective-cブロックをプロパティに保存します。どうすればいいかわからなかったので、少しグーグルで検索しましたが、この件に関する情報はほとんどありません。しかし、私は最終的に解決策を見つけることに成功し、私のような他の初心者のために共有する価値があるかもしれないと考えました。

最初は、Block_copyとBlock_releaseを使用するには、手動でプロパティを記述する必要があると考えていました。

幸いなことに、 ブロックはNSObjects であり、_- copy_/_- release_は_Block_copy_/_Block_release_と同等であることがわかりました。したがって、@property (copy)を使用して、セッターとゲッターを自動生成できます。

76
Piotr Czapla

編集:ARC用に更新

typedef void(^MyCustomBlock)(void);

@interface MyClass : NSObject

@property (nonatomic, copy) MyCustomBlock customBlock;

@end

@implementation MyClass

@end

MyClass * c = [[MyClass alloc] init];
c.customBlock = ^{
  NSLog(@"hello.....");
}

c.customBlock();
135
Dave DeLong

あるいは、typedefなし

@property (copy, nonatomic) void (^selectionHandler) (NSDictionary*) ;

98
Steven Kramer

これに関する非常に良い説明は、83ページから始まるWWDC 2012セッション712にあります。ARCでブロックを保存する正しい方法は次のとおりです。

@property(strong) my_block_type work;

保持サイクルに注意してください。解決する良い方法は、不要になったらブロックをnilに設定することです。

self.work = nil;
9
Jorge Perez