如果我从块内部调用的函数引用“self”,那会创建一个保留周期吗?
__weak id weakSelf = self; - (void)firstFunction { id strongSelf = weakSelf; if (!strongSelf) return; [anObject performBlock:^{ [strongSelf secondFunction]; }]; } - (void)secondFunction { [self doSomeCrazyStuff]; self.counter++; //etc. }
我在’secondFunction’中调用’self’,我是否需要将弱指针传递给此函数并使用它?
解决方法
潜在的.
保留周期是通过具有强引用的循环来创建的,除了变量上的限定符(即弱,强)之外,那些引用来自的实际变量是无关紧要的.如此强大的自我引用的自我是对自我的强烈参考,你有一个保留周期的潜力,就像你自己使用自我一样.
回复:评论
让您的块保持弱引用是解决此问题的标准方法.如果在块中使用weakSelf,则没有强引用,如果在块调用时,weakSelf为nil则调用[weakSelf secondFunction]将不执行任何操作 – 您可以在Objective-C中发送nil消息.您不会创建一个循环,在块的调用期间可能会创建一个强大的引用副本,但这将在调用该块后返回.