Ios 在ARC应用程序上未调用Dealloc
我有一个UIViewController,它被推到容器控制器上,然后弹出,使用分配工具,我可以看到视图控制器随后被销毁。但是,永远不会到达控制器的dealloc中的断点。有人知道为什么不叫dealloc吗?ARC是否可以在不调用dealloc的情况下销毁对象 此外,我还禁用了NSZombies(有些人说这会导致dealloc不开火) 编辑: Dealloc做的不多,只是打印到控制台,而且它从未被调用:Ios 在ARC应用程序上未调用Dealloc,ios,ios5,automatic-ref-counting,Ios,Ios5,Automatic Ref Counting,我有一个UIViewController,它被推到容器控制器上,然后弹出,使用分配工具,我可以看到视图控制器随后被销毁。但是,永远不会到达控制器的dealloc中的断点。有人知道为什么不叫dealloc吗?ARC是否可以在不调用dealloc的情况下销毁对象 此外,我还禁用了NSZombies(有些人说这会导致dealloc不开火) 编辑: Dealloc做的不多,只是打印到控制台,而且它从未被调用: -(无效)解除锁定 { NSLog(@“解除分配…”); } 我不能发布容器控制器-它是专有的
-(无效)解除锁定
{
NSLog(@“解除分配…”);
}
我不能发布容器控制器-它是专有的,太复杂了。Dealloc在某些控制器上被一致调用,而不是在其他控制器上。如果我能找到时间,我会尝试发布一个简化版本,重现这个问题
有没有办法验证NSZombies是否已禁用
Edit2
我发布了一个来自instruments的截图;在我看来,这似乎是适当的解除分配
如果VC没有调用dealloc,那么我敢打赌代码中的某个地方有一个循环引用,这会阻止ARC调用dealloc 一些需要检查的事项:
当我的代理声明没有使用“不安全”未恢复时,我被掐死了。您是否启用了NSzombie?见这个问题:
我自己也被这个问题困扰了一段时间……我刚刚遇到了一个类似的问题。你有没有提到“自我”的地方?我在init中有一些用于通知观察的块,我指的是“self”。弧下的“自”保留在块中。我的dealloc没有接到电话,这就是我删除观察的地方 诀窍是创建一个对“自我”的“弱”(iOS 5+)或“不安全”(iOS 4.x)引用,并使用该引用访问块中的自我或任何IVAR(这些将导致“自我”也被保留)。这里有一个例子
__unsafe_unretained TableViewController *weakSelf = self;
[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextObjectsDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
if (weakSelf.tableView) {
[weakSelf.tableView reloadData];
}
}];
即使使用ARC,您也可以手动检查参考计数:
CFIndex rc = CFGetRetainCount((__bridge CFTypeRef)myObj);
您可以确定您的代码是否在内存周期中挂起。这里有另一个提示(发生在我身上):
tl;dr:还要查看类实例变量,而不仅仅是类属性。您是否在代码中分配了任何实例变量,并且以后没有将其设置为nil
我有一个类的头文件中有一堆属性(@property(非原子,强)
和@property(非原子,弱)
)。我一个接一个地注释掉这些属性,看看这是否会改变什么。事实并非如此。主类仍然没有被释放。所以问题不在属性上
我后来做的是查看实例变量。我有一个实例变量(它是一个UIViewController
),是我在viewDidLoad
上创建的。这一个从来没有被释放
当我删除这个变量时,我的主类dealloc确实被删除了
因为这一个没有释放,我的主类也没有释放。将该实例变量作为属性移动解决了我的问题
问题:我不知道为什么会发生这种情况。操作系统对类属性的控制是否比对实例变量的控制更好?似乎有点奇怪,包含实例变量的父类由于其实例变量而没有被释放。在我的例子中,它是
NSTimer
。它保留了它的目标,所以当您使用view controller时,需要使计时器无效。我的问题是委托
检查您的代表!委托属性应指定弱
:
弱var委托:SomeProtocol?
或
@属性(弱、非原子)id委托代码>即使在ARC下,也应该调用它。但是,您不能包括[super Dealoc],ARC将为您添加该内容。可能共享该类的代码?dealloc方法中是否有任何方法?您应该发布-(void)dealloc{}
代码。您是否尝试使用NSLog(…)
来标记您的dealloc()
而不是断点?如果使用ARC,您在dealloc中放了什么代码?也许,如果dealloc代码没有做任何事情,编译器只是在优化它。你有没有试着在里面放一个NSLog()而不是一个断点?我同意@Dean Liu-Instruments的观点,尽管如此,我怀疑它不是因为内存周期而取消分配的。我偶尔会遇到使用块的循环的问题-特别是如果块引用“self”,这很容易做到。这很有帮助!(如果有一个相应的函数调用方法给出引用对象的所有对象的列表,那就太好了)。在代码检查了大量迁移的代码(从非arc项目到arc项目)之后,我可以确认这是不希望的保留周期的主要来源。最后:一个块很方便,很容易创建,对吧!通过不注销观测者,这意味着它将永远对通知作出响应,即使在self
早已消失之后。如果您多次添加此观察者,那么每次发生此通知时,它将永远触发多个无用的观察者。这不是好的编程实践。为了简单起见,我们可以使用弱类型的(self)weakSelf=self
[NSNotificationCenter addObserverForName:object:queue:usingBlock:][/code>返回一个不透明对象作为观察者。你需要退订。