【发布时间】:2010-11-13 11:51:59
【问题描述】:
在这个 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方法作用域后会被销毁吗?
【问题讨论】:
标签: objective-c memory-management objective-c-blocks