【问题标题】:Memory leak warning on release but not on autorelease释放时出现内存泄漏警告,但自动释放时没有
【发布时间】:2011-07-10 05:06:07
【问题描述】:

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

如果我在初始化同一个对象时使用自动释放,我不会遇到任何问题。我的问题是:如果 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

【问题讨论】:

    标签: iphone memory-leaks uitableview release autorelease


    【解决方案1】:

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

    自动释放基本上只是稍后发生的手动释放(在[NSAutoreleasePool drain][NSAutoreleasePool release] 被调用时)。

    如果您希望您的方法之一返回调用者拥有的对象,则必须使用自动释放,因为如果您在“返回”之前调用释放并且保留计数为零(如果您刚刚制作了对象),那么该对象将立即被释放,然后无法使用。方法的调用者发现自己有一个指向一些垃圾非对象的指针。

    【讨论】:

    • 顺便说一句,我注意到你没有使用细胞重复使用的东西。请注意,如果您不使用它,您的表格可能会表现不佳。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 感谢您的澄清。现在它完全有道理。我已经好几年没有用 C 编程了,因为我忘记了 return 是函数中的最后一个语句。在 PHP 或 Java 中,由于语言的性质,在 return 语句之后我永远不会有任何东西。非常感谢
      【解决方案4】:

      当你return cell 之后你不拥有该对象,因此你不能release 它。执行 return 语句时,函数将返回到调用它的位置。所以return之后的语句不会被执行。所以当你releasecellreturn之后它没有被执行,这意味着cell没有被释放。因此它会导致内存警告。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多