在这个 Apple 参考中,objective-c 中有一个 Blocks 对象的概念概述:
http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Blocks/Blocks.pdf
但是,它并没有真正解释两个与我有关且可能与其他人有关的主题。第一个问题是这样的:我可以将 nil 分配给 Block 引用吗?或者我应该使用NULL?或者我不能使用它们?
第二个问题在于内存管理领域。比如说,我已经声明了这样一个在堆栈上创建块对象的方法。
-(void)makeTheClass
{
TheClass *object = [[TheClass alloc] init];
object.blockReference = ^(void) { return nil; }
}
这个对象是在某个范围内创建的,在它离开后将被销毁。但是 TheClass 对象实际上将存储对这个(几乎被破坏的)块的引用:
typedef id (^WeirdBlockType)(void);
@interface TheClass {
WeirdBlockType blockReference;
}
如何为这样的块声明类属性?这两者有什么区别:
@property (nonatomic, retain) WeirdBlockType blockReference;
@property (nonatomic, copy) WeirdBlockType blockReference;
?
在 Apple 文档中明确指出,块复制将块移动到堆中。但如果我只是保留它呢?超出makeTheClass
方法范围后会被销毁吗?