测试对象是否已取消分配

Dan*_*Ray 4 iphone objective-c

我有一种情况偶尔我的-tableView: numberOfRowsInSection:方法要求解除分配的NSArray的计数.我希望能够测试该阵列的方式,是安全的,不会做出僵尸通话被释放.

我的代码目前看起来像:

-(NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section
{
    if (! self.offers){
        return 0;
    }
    return [self.offers count];
}
Run Code Online (Sandbox Code Playgroud)

我只是通过调试程序逐步完成并观察它通过! self.offers测试然后残酷地崩溃[self.offers count].我打开了NSZombies,在那一行我得到了NSLog消息:

-[__NSArrayM count]: message sent to deallocated instance 0x283dc0
Run Code Online (Sandbox Code Playgroud)

所以,无论是self.offers,在这一点上,是不是零,但也没有任何在有效指出.我该如何测试呢?

编辑:感谢强烈的爱,朋友们.我已经想通了,为什么我一直在用我的内存管理的麻烦-它实际上是委托关系,挥之不去的时间比他们有用的问题.请参阅此处以获取我的问题的完整答案: 管理对视图退出时取消分配的对象的调用

Ben*_*tto 15

这是不可能的"测试" this--一旦对象被释放,它不见了,指针它实际上是垃圾.对它做任何事都容易崩溃.

对不起,是坏消息,但得到这个工作权利的唯一方法是,以确保内存管理各地(在这种情况下)offers是正确的,在所有uses--保留,并在所有点正确释放,其中该实例变量被操纵,它永远不会是非零垃圾.

你应该尝试运行静态分析(建设 - >建立与分析)开始with--这个工具可以帮助标记存储管理模式问题,而你的一部分很多额外的挖掘.

  • 一旦你放弃了它的所有权,+1并将`offer`设置为`nil`.这样你可以将你的代码更改为`return [self.offers count];`,因为`[nil count]`返回0. :) (2认同)