rob*_*rob 38 ios ios5 automatic-ref-counting
我有一个UIViewController被推到容器控制器然后弹出,并使用分配工具,我可以看到视图控制器后来被销毁.但是,从未达到控制器dealloc中的断点.有谁知道为什么没有调用dealloc?ARC可以在不调用dealloc的情况下销毁对象吗?
此外,我已经禁用了NSZombies(有些人说可以导致dealloc不能开火).
编辑:
Dealloc没有做太多,只是打印到控制台,它永远不会被调用:
- (void)dealloc
{
NSLog(@"Deallocating...");
}
我不能发布容器控制器 - 它是专有的,太复杂了.Dealloc在某些控制器上持续调用,而不是其他控制器.如果我能找到时间,我会尝试发布一个简化版本来重现问题.
有没有办法验证NSZombies是否被禁用?
EDIT2
我正在发布仪器截图; 它看起来像是正确的解除分配.

小智 92
我刚遇到类似的问题.你有什么街区你指的是'自我'吗?我在我的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];
}
}];
Run Code Online (Sandbox Code Playgroud)
Dea*_*Liu 20
如果VC没有调用dealloc,那么我敢打赌你的代码中有一个循环引用,这阻止了ARC调用dealloc.
有些事要检查:
当我的委托声明没有使用__unsafe_unretained时,我被扼杀在屁股中.
jbb*_*nni 16
即使使用ARC,您也可以手动检查引用计数:
CFIndex rc = CFGetRetainCount((__bridge CFTypeRef)myObj);
Run Code Online (Sandbox Code Playgroud)
您可以确定您的代码是否在内存周期中挂起.
kga*_*dis 15
我的问题是代表们.
检查你的代表!委托属性应该weak指定:
weak var delegate: SomeProtocol?
要么
@property (weak, nonatomic) id<SomeProtocol> delegate;
And*_*rei 10
这是另一个提示(发生在我身上):
tl; dr:查看你的类实例变量,而不仅仅是类属性.您是否在代码中分配任何实例变量,而不是将其设置为nil以后?
我的头文件中有一堆属性(@property (nonatomic, strong)和@property (nonatomic, weak)).我逐一评论这些属性,看看这是否会改变任何东西.它没.主要班级仍未被解除分配.所以问题不在于属性.
之后我做的是查看实例变量.我有一个实例变量(它是一个UIViewController),我创建了它viewDidLoad.这个从来没有得到解除!
当我删除这个变量时,我的主要类叫做dealloc.
因为这个没有被解除分配,我的主要课程也没有被解除批准.将该实例变量作为属性移动解决了我的问题.
问题:我不确定为什么会这样.与实例变量相比,操作系统是否可以更好地控制类的属性?包含实例变量的父类由于其实例变量而未被释放似乎有点奇怪.