我正在设置一个在自定义UIButton印刷机上调用的块。我将块分配给viewDidLoad()中的UIButton实例。
- (void) viewDidLoad{
[super viewDidLoad];
_customBTN.block = ^{
self.test = @"Something";
}
}
我是否应该将块保留在堆栈上,因为块只能在按下按钮时调用,这意味着viewDidLoad()将在堆栈上,这可以被视为高性能/最佳实践......或者我在做什么有什么不对吗?
答案 0 :(得分:1)
块不会停留在堆栈(内存堆栈)上而是被复制(块内引用的Objc
个对象获得保留调用(+1 retainCount
)并且标量变量被复制)到实例化时的堆。它意味着行:
_customBTN.block = ^{
self.test = @"Something";
};
执行,堆栈框架为从弹出 创建了viewDidLoad
函数,self
得到了+1 retainCount
和块被分配给块属性of _customBTN
,稍后在when _customBTN
调用块(比如按钮点击事件)块被执行并且它使用self并执行它确实
P.S。在块内引用时,可以安全地使用weak
对self
的引用。 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";
}