【问题标题】:Blocks in objective C目标 C 中的块
【发布时间】:2015-08-05 05:15:16
【问题描述】:
@interface
    @property (strong) void(^myPropertyBlock)(void);
@end

@implementation
    self.myPropertyBlock = ^{[self anyMethod];};
@end

现在编译器显示一个关于“强引用循环”的警告,这是它应该做的。现在,如果我将“自我”设置为弱属性,它工作得非常好,因为正如预期的那样,它将打破强引用循环。

MyViewController * __weak _self = self;

现在问题来了:

@interface
    @property (weak) void(^myPropertyBlock)(void);
@end

@implementation
    self.myPropertyBlock = ^{[self anyMethod];};    
@end

1) 如果我将块设置为弱属性,它也应该打破强引用循环。但是,令我惊讶的是,它没有。

我已经在网上搜索过,但没有找到任何相关内容。

【问题讨论】:

  • "1) 如果我将块设置为弱属性,它也应该打破强引用循环。但是,令我惊讶的是,它没有。实际上,它会导致块被立即释放,因为它没有强引用,并且属性将设置为nil
  • @newacct 是的,这可能是我正在寻找的答案。但是你能告诉我它什么时候会被设置为 nil。假设我在定义块后立即调用它。还有一件事我想问的是为什么编译器会给出关于保留周期的警告。
  • @newacct 我的意思是无论如何:无论是否设置为 nil,但我的理解是没有保留周期。那么为什么会发出警告。

标签: objective-c-blocks


【解决方案1】:

必须将块声明为copy,否则它不会被复制到堆中,当你执行它时你会得到讨厌的sigsegv错误。即使您将其设置为实现并在下一行调用它也没关系。因此,您必须始终根据需要使用复制和中断保留周期来定义它。

【讨论】:

    【解决方案2】:

    块本身将保持对其引用的任何对象的强引用。在块外声明 __weak 指针,然后在块内引用该指针,避免保留循环。

    创建这些保留循环的块本身。该块保留self,但self 不保留该块。如果释放其中一个或另一个,则不会创建循环,并且会按应有的方式释放所有内容。

    在块“执行”时,块将“weakSelf 的值”(如果同时释放 self 则为零)复制到 strongSelf,然后 ARC 对其应用保留。因此,在块的持续时间内,strongSelf 引用的对象将保持活动状态,如果它一开始是活动的。如果你只依赖weakSelf,它可能会在块执行期间的任何时候变为nil。

    希望对您有所帮助:Breaking retain cycle with strong/weak self

    【讨论】:

    • 因为我已经编写了上面的代码,我知道如何打破循环。但问题是如果我将块属性设为弱,它应该会自动打破循环。但它没有。
    【解决方案3】:

    Statement Block属性,首先需要使用copy修饰符,因为只有经过Block的copy才会存在于堆中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多