Objc块和内存管理

时间:2015-08-06 16:28:46

标签: automatic-ref-counting objective-c-blocks objective-c-2.0

我正在设置一个在自定义UIButton印刷机上调用的块。我将块分配给viewDidLoad()中的UIButton实例。

- (void) viewDidLoad{
   [super viewDidLoad];
   _customBTN.block = ^{
     self.test = @"Something";
   }
}

我是否应该将块保留在堆栈上,因为块只能在按下按钮时调用,这意味着viewDidLoad()将在堆栈上,这可以被视为高性能/最佳实践......或者我在做什么有什么不对吗?

2 个答案:

答案 0 :(得分:1)

块不会停留在堆栈(内存堆栈)上而是被复制(块内引用的Objc个对象获得保留调用(+1 retainCount)并且标量变量被复制)到实例化时的堆。它意味着行:

 _customBTN.block = ^{
     self.test = @"Something";
   };

执行,堆栈框架弹出 创建了viewDidLoad函数,self得到了+1 retainCount和块被分配给块属性of _customBTN,稍后在when _customBTN调用块(比如按钮点击事件)块被执行并且它使用self并执行它确实

P.S。在块内引用时,可以安全地使用weakself的引用。 weak retainCount self不会增加<script src=./scripts/vendor.js></script> <script src=./scripts/main.js></script> (在更糟糕的情况下会导致保留周期)。

答案 1 :(得分:0)

如果没有其他选择,你可以这样做。另外,请勿在块中使用 self 。创建一个这样的周参考:

__weak typeof(self) weakSelf = self;

并在块中使用它:

_customBTN.block = ^{
  weakSelf.test = @"Something";
}