【问题标题】:Why does the assignment of an objc block have to be 'copy', not 'assign'?为什么 objc 块的分配必须是“复制”而不是“分配”?
【发布时间】:2011-01-12 02:24:34
【问题描述】:

我正在研究 Objective-C 中块的使用,但还没有真正找到一个很好的解释来解释为什么如果要将块分配给实例变量,则必须将其分配给 @987654321 @而不是assign

例如:

typedef void (^MyBlock)();

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

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

//  other declarations

@end

【问题讨论】:

    标签: objective-c memory-management functional-programming objective-c-blocks


    【解决方案1】:

    好吧,我们来分析一下:

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

    MyBlock block = ^{};
    

    然后您只需将其分配给带有assign 的属性:

    self.myblock = block;
    

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

    【讨论】:

    • 即在堆栈上创建块以提高速度,并且 -copy 将它们从堆栈中移到堆中。
    【解决方案2】:

    因为blocks are weird

    【讨论】:

    • 有时,快速需要怪异。
    【解决方案3】:

    wwdc 视频“高级 Objective-C 和垃圾收集”中有一个很好的解释,如果您开始接触块并想要解释一些内部结构,则值得一看。那里还有其他一些很棒的演讲。强烈推荐。

    【讨论】:

      猜你喜欢
      • 2021-03-20
      • 2021-09-25
      • 1970-01-01
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 2020-06-04
      相关资源
      最近更新 更多