发布时的内存泄漏警告,但不是自动释放

时间:2011-03-07 08:55:33

标签: iphone memory-leaks uitableview release autorelease

在返回对象后释放对象时出现内存泄漏警告问题。我读了几篇关于类似主题的帖子,但在这些帖子中,发布的问题是“他们”最终没有真正拥有他们发布的对象。

如果我在初始化同一个对象时使用autorelease,我没有遇到任何问题。我的问题是:如果Apple建议手动释放我们创建的所有对象,我怎么得到这个警告?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";

    //Display no cells until it loads
    if([items count] < numberOfItemsToDisplay){

        UITableViewCell *cell = [[[UITableViewCell alloc] init]autorelease]; 
        return cell;
        //[cell release];

    }

我没有问题自动释放对象,但我讨厌不理解我认为我理解的东西:)

谢谢,L

4 个答案:

答案 0 :(得分:2)

Apple没有说“手动释放你创建的所有对象” - 他们只是说“最终释放你创建的所有对象”。这可以通过手动释放或自动释放来完成。

autorelease基本上只是一个手动版本,发生在稍后的某个时刻(在[NSAutoreleasePool drain][NSAutoreleasePool release]被调用的时候)。

如果你想让你的一个方法返回一个由调用者拥有的对象,你必须使用自动释放,因为如果你在'return'之前调用release而且retain count则为零(这通常是你刚刚创建了对象)然后对象将被立即释放,然后无法使用。该方法的调用者发现自己有一个指向一些垃圾非对象的指针。

答案 1 :(得分:1)

返回return语句后,不再执行任何操作。因此返回后释放将不会执行。所以你会泄漏内存。并且您无法在返回之前释放,因为调用者将使用该对象。所以你真的无法在返回之前释放它。所以你有两种方法来处理这种情况。第一个选项是使返回的对象自动释放。另一种选择是以这样的方式创建函数名,使得调用者知道它拥有返回的对象并且必须释放它。

检查Returning Objects from Methods from Memory Management Programming Guide以了解此案例的详细说明。

答案 2 :(得分:0)

当你return cell之后你没有拥有该对象,因此你不能release它。执行return语句时,函数返回到调用它的位置。所以return之后的语句没有被执行。因此,当release cell return未执行后,cell意味着{{1}}未被释放。因此它会引起记忆警告。

答案 3 :(得分:0)

在xcode中添加一个UitableView类,它会自动正确添加委托,以便重用tableviewcells。