[英]Dealloc not being called on ARC app
我有一个UIViewController被推到容器控制器然后弹出,并使用分配工具,我可以看到视图控制器后来被销毁。 但是,从未达到控制器dealloc中的断点。 有谁知道为什么没有调用dealloc? ARC可以在不调用dealloc的情况下销毁对象吗?
此外,我已经禁用了NSZombies(有些人说可以导致dealloc不能开火)。
编辑:
Dealloc没有做太多,只是打印到控制台,它永远不会被调用:
- (void)dealloc { NSLog(@"Deallocating..."); }
我不能发布容器控制器 - 它是专有的,太复杂了。 Dealloc在某些控制器上持续调用,而不是其他控制器。 如果我能找到时间,我会尝试发布一个简化版本来重现问题。
有没有办法验证NSZombies是否被禁用?
EDIT2
我正在发布仪器截图; 它看起来像是正确的解除分配。
我刚遇到类似的问题。 你有什么街区你指的是'自我'吗? 我在我的init中有一些用于通知观察的块,我指的是'self'。 在ARC下,self保留在块中。 我的dealloc没有被调用,这就是我删除观察的地方。
诀窍是创建一个__weak(iOS 5+)或__unsafe_unretained(iOS 4.x)引用你的'self'并使用它来访问self或任何_iVars(这些也会导致'self'被保留)块。 这是一个例子。
__unsafe_unretained TableViewController *weakSelf = self;
[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextObjectsDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
if (weakSelf.tableView) {
[weakSelf.tableView reloadData];
}
}];
就我而言,这是NSTimer
。 它保留了其目标,因此您需要在完成视图控制器时使计时器无效。
如果VC没有调用dealloc,那么我敢打赌你的代码中有一个循环引用,这阻止了ARC调用dealloc。
有些事要检查:
当我的委托声明没有使用__unsafe_unretained时,我被咬了屁股。
即使使用ARC,您也可以手动检查引用计数:
CFIndex rc = CFGetRetainCount((__bridge CFTypeRef)myObj);
您可以确定您的代码是否在内存周期中挂起。
我的问题是代表们。
检查你的代表! 委托属性应该指定weak
:
weak var delegate: SomeProtocol?
要么
@property (weak, nonatomic) id<SomeProtocol> delegate;
这是另一个提示(发生在我身上):
tl; dr:查看你的类实例变量,而不仅仅是类属性。 您是否在代码中分配任何实例变量,而不是稍后将其设置为nil
?
我的头文件中有一堆属性( @property (nonatomic, strong)
和@property (nonatomic, weak)
)。 我逐一评论这些属性,看看这是否会改变任何东西。 它没。 主要班级仍未被解除分配。 所以问题不在于属性。
之后我做的是查看实例变量。 我有一个实例变量(它是一个UIViewController
),我在viewDidLoad
创建。 这个从来没有得到解除!
当我删除这个变量时,我的主要类叫做dealloc。
因为这个没有被解除分配,我的主要课程也没有被解除批准。 将该实例变量作为属性移动解决了我的问题。
问题:我不确定为什么会这样。 与实例变量相比,操作系统是否可以更好地控制类的属性? 包含实例变量的父类由于其实例变量而未被释放似乎有点奇怪。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.