在这个苹果参考文献中,有一个关于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;
在苹果文档中明确指出,块复制会将块移动到堆上。但如果我只是保留它呢?当它超出makeTheClass
方法的范围时,它会被销毁吗?