4

我开始在 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
4

3 回答 3

9

好吧,让我们分析一下:

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

MyBlock block = ^{};

然后,您只需将其分配给具有以下属性的属性assign

self.myblock = block;

当包含方法返回时,block变量将超出范围并被释放。因此,考虑到这一点,您必须copy将块对象存储在您的实例变量中。这样,您可以在包含对象的生命周期内拥有该块。

于 2011-01-12T02:28:05.817 回答
4

这是因为块很奇怪

于 2011-01-12T02:28:14.977 回答
0

wwdc 视频“Advanced Objective-C and Garbage Collection”中有一个很好的解释,如果你开始接触块并想要解释一些内部结构,值得一看。那里还有其他一些很棒的演讲。强烈推荐。

于 2011-01-12T20:25:02.363 回答