为什么objc块的赋值必须是'copy',而不是'assign'?

Way*_*man 4 functional-programming memory-management objective-c objective-c-blocks

我正在使用Objective-C中的块,并且没有真正找到一个很好的解释为什么一个块,如果你要将它分配给一个实例变量,必须分配,copy而不是assign

例如:

typedef void (^MyBlock)();

@interface SomeClass : NSObject
{
    MyBlock myblock;
    // Other ivars
}

@property (nonatomic, copy) MyBlock myblock;  // Why must this be 'copy'???

//  other declarations

@end
Run Code Online (Sandbox Code Playgroud)

Jac*_*kin 9

好吧,让我们分析一下:

假设您在某个方法中创建了一个块,将其分配给某个变量:

MyBlock block = ^{};
Run Code Online (Sandbox Code Playgroud)

然后你只需将它分配给一个属性assign:

self.myblock = block;
Run Code Online (Sandbox Code Playgroud)

当contains方法返回时,该block变量将超出范围并取消分配.因此,考虑到这一点,您必须copy使用块对象,然后将其存储在实例变量中.这样,您可以拥有包含对象生命周期的块.

  • 即在堆栈上创建块以获得速度,并且-copy将它们从堆栈移到堆中. (8认同)