如何在 Objective-C 中存储属性块?

我希望将 Objective-c 块存储在一个属性中以供以后使用。我不知道如何做到这一点,所以我谷歌了一下,有关这一主题的信息非常少。但是我最终还是找到了解决方案,我觉得对于像我这样的新手来说,这可能是值得分享的。

最初我认为我需要手工编写属性来使用 Block _ copy & Block _ release。

幸运的是,我发现 块是 NSObjects- copy/- release相当于 Block_copy/Block_release。所以我可以使用 @property (copy)自动生成 setter 和 getter。

41065 次浏览

编辑: 为 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();

或者,不使用 typedef

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

您可以在 WWDC 2012会议712的第83页找到一个很好的解释。在 ARC 下保存一个区块的正确方法如下:

@property(strong) my_block_type work;

小心保留循环。解决这个问题的一个好办法是,当你不再需要这个块时,将它设置为 nil:

self.work = nil;