【问题标题】:iPhone object checking to releaseiPhone对象检查释放
【发布时间】:2011-08-09 05:03:32
【问题描述】:

我想检查一个对象是否有一些计数这是我的测试代码

NSMutableArray  *array=[[NSMutableArray alloc]init];

    if(array)
    {
        NSLog(@"hiiiiiii"); 
    }

案例-2

NSMutableArray  *array=[[NSMutableArray alloc]init];
    [array release];
    if(array)
    {
        NSLog(@"hiiiiiii"); 
    }

在这两种情况下,我得到的输出与打印的“hiiiiiii”相同。

谁能告诉我如何检查我的对象是否需要释放或已经释放。

我知道我应该跟踪我的对象的计数器,但我正处于我的代码过于复杂的阶段,我需要帮助..

请帮忙..

还告诉苹果允许多少内存泄漏?

【问题讨论】:

    标签: iphone memory-leaks release


    【解决方案1】:

    在您的第二种情况下,您正在释放 NSMutableArray 但它仍然存储 非零 值,尽管它不再使用(调用函数或获取值)。这就是您的 if 条件的原因得到true

    请记住,每当您在任何对象上调用 release 时,不要忘记将 nil 分配给它,因此您的第二个代码应如下所示。

    案例-2

    NSMutableArray  *array=[[NSMutableArray alloc]init];
        [array release];
         array = nil;
        if(array)
        {
            NSLog(@"hiiiiiii"); 
        }
    

    如果您的 allocedretain 任何您必须调用 release 的对象,Object-C 中有一个简单的内存管理规则,

    Read memory management Guide from Apple.

    【讨论】:

    • 感谢您的回答,声望达到 15 时将给予支持
    【解决方案2】:

    没有办法检查你是否“应该”释放一个对象。执行“if(object)”之类的操作只会检查对象的指针。即使它指向的对象在很久以前被销毁,它也会返回 true。这就是在您的第二种情况下发生的情况。当你调用 release 时对象被销毁,但指针仍然指向某个东西,所以它返回 true。如果指针设置为 nil,它只会返回 false。

    但是,调用释放有一套简单的规则。如果您曾经对对象调用“alloc”、“new”、“copy”、“mutableCopy”或“retain”,则必须始终对其调用“release”或“autorelease”。这将防止任何内存泄漏。

    Apple 没有公开允许的内存泄漏量。消除任何已知的内存泄漏总是最安全的;此外,这将意味着您的客户获得更好的性能。

    【讨论】:

    • 感谢您的回答,声望达到 15 时将给予支持
    • 所以我应该使用 array=nil;每次当我释放我的对象时……那会好吗……那么其他计数呢(如果我的对象有超过 1 个计数)。
    • 只有在其他东西保留它的情况下,您的对象计数才应该大于零。在这种情况下,他们现在“拥有”它并且您不必担心它,如果他们正确处理它(根据规则),它将在所有对象完成后被销毁。是的,释放变量后将其设置为 nil 总是最安全的。
    猜你喜欢
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多