ios - 当 block 内的 ivar 可能被释放时,管理内存的最佳方法是什么?

标签 ios objective-c memory-management objective-c-blocks

假设您有这样的事情:

 ivarOutsideOfBlock = @"foo"; 

 [doSomethingThatTakesAwhile start:^(NSError *error) {
        if(!error){
            ivarOutsideOfBlock = @"somethingElse";
            // Might crash because iVarOutsideOfBlock may no longer exist
        }
  }];

此时,假设对 View Controller ivar 的引用被释放。代码会崩溃吗(INVALID ADDRESS)?

这方面的最佳做法是什么?是不是把ivar转成view controller上的strong property?

最佳答案

Block 中对 ivar 的引用是隐式的 viewController->ivar,并且 Block 对 ivar 的 owner 进行了强引用。它不会在 block 被释放之前被释放。

看起来你实际上有一个 retain cycle因为 Block 的所有者与引用对象相同。这是有问题的:Block 和另一个对象使彼此保持事件状态,并且都不能被释放。

关于ios - 当 block 内的 ivar 可能被释放时,管理内存的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29107312/

相关文章:

c - 如何管理插入和删除内容的内存?

java - 简单的 Swing 程序即使在空闲时也使用 ~200MB?

ios - 多对一

ios - 在 Spritekit 上将一个 ViewController 导航到另一个

objective-c - CoreData - 一对多建模关系以一对一形式出现

Windows 中的 Objective-C

objective-c - 我可以提前释放自动释放对象吗?

ios - 在 TabBarController 中添加 View Controller 作为带有导航栏的 subview

ios - 仅一个屏幕的横向方向模式 - iPhone

ios - 在 TableViewCell 中播放视频