2011-03-07 75 views
2

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

如果我在初始化同一个对象时使用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]; 

    } 

我没有问题自动释放的对象,但是当你return cell你不拥有这一点,因此之后的对象我不喜欢不理解的事情,我想我明白了:)

感谢,L

回答

1

返回语句函数返回后没有进一步执行。所以在返回后释放将不会执行。所以你会泄漏记忆。而且你不能在返回之前释放,因为调用者将使用该对象。所以你真的不能在返回之前释放它。所以你有两种方法来处理这种情况。第一个选项是让返回的对象自动释放。另一个选择是以这样的方式创建函数名称,使得调用者知道它拥有返回的对象并且必须释放它。

查询Returning Objects from Methods from Memory Management Programming Guide了解本案的详细说明。

+0

谢谢你的澄清。现在它非常有意义。我多年来一直没有用C语言编程,我忘记了返回是函数中的最后一个语句。在PHP或Java中,由于语言的性质,在返回语句之后我将永远不会有任何东西。非常感谢你 – luigi7up 2011-03-08 08:26:37

0

你不能release它。当执行return语句时,函数返回到被调用的地方。因此return之后的语句不会执行。所以当你在return之后releasecell没有执行,这意味着cell没有被释放。因此它会导致内存警告。

+0

请看看这是否有助于你http://www.iphonedevsdk.com/forum/iphone-sdk-development/19624-how-release-object-returned-function.html – visakh7 2011-03-07 09:07:19

2

苹果不会说“手动发布您创建的所有对象” - 他们只是说“最终发布您创建的所有对象”。这可以通过手动发布或autorelease完成。

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

如果您希望某个方法返回调用者拥有的对象,则必须使用autorelease,因为如果您在“返回”之前调用release,并且保留计数为零(通常它会如果你刚刚创建了该对象),那么该对象将立即被解除分配,然后无法使用。该方法的调用者发现自己有一个指向某个垃圾非对象的指针。

+0

顺便说一句,我注意到你没有使用细胞再利用的东西。只是要警告,如果你不使用它,你可能在表格中表现不佳。 – occulus 2011-03-07 09:18:39

0

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