78

我想将objective-c 块存储在一个属性中以供以后使用。我不知道该怎么做,所以我用谷歌搜索了一下,关于这个主题的信息很少。但我最终设法找到了解决方案,我认为这可能值得像我这样的其他新手分享。

最初我认为我需要手动编写属性才能使用 Block_copy 和 Block_release。

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

4

3 回答 3

136

编辑:为 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();
于 2010-11-02T20:41:08.830 回答
102

或者,没有 typedef

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

于 2011-10-13T10:27:37.657 回答
9

您可以在从第 83 页开始的 WWDC 2012 session 712 中找到一个很好的解释。在 ARC 下保存块的正确方法如下:

@property(strong) my_block_type work;

小心保留周期。一个很好的解决方法是在不再需要时将块设置为 nil:

self.work = nil;
于 2012-08-02T11:05:51.860 回答