记忆管理问题

时间:2011-04-26 15:29:29

标签: iphone objective-c xcode

释放多个无法立即释放的对象实例的最佳方法是什么?

例如,如果您要创建一堆缩略图:

   for(int i=0; i <totalThumbs; i++){        

     Thumb *newThumb = [[Thumb alloc] initWithImage:someImage]

     //position the thumbs here, etc.

     //assume releasing here breaks the app because we need to interact with the thumbs   later
     // [newThumb release] --- breaks the app         

    }

将所有新对象放入数组并在不再需要时在viewDidUnload中释放它们是否有意义?

4 个答案:

答案 0 :(得分:3)

据推测,您要将每个newThumb添加为其他视图或数组的子视图,因此您可以这样做,然后在此处发布newThumb。例如:

Thumb *newThumb = [[Thumb alloc] initWithImage:someImage];
[myThumbs addObject:newThumb];
[newThumb release];

这是有效的,因为myThumbs保留了该对象。

为了不泄漏内存,特别是如果重新生成缩略图,您需要遍历superview的子视图(所有拇指),从superview中删除每个,并释放它们。您可能还需要在释放超级视图的dealloc方法中执行此操作(假设您这样做)。使用数组,您可以简单地调用removeAllObjects,我相信。

答案 1 :(得分:2)

也许我错过了什么,但为什么不使用autoreleasepools?

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

for(int i=0; i <totalThumbs; i++){        
  Thumb *newThumb = [[[Thumb alloc] initWithImage:someImage]autorelease];
}

[pool drain];

调用autorelease会将其添加到池中(您可以在任何您喜欢的范围内创建)。完成后,只需在池上调用drain(或release)。这将释放所有排队的对象。

答案 2 :(得分:1)

您可以在添加到阵列后立即释放它们,因为数组会保留它们:

for(int i=0; i <totalThumbs; i++){        
    Thumb *newThumb = [[Thumb alloc] initWithImage:someImage]

    //position the thumbs here, etc.

    [thumbsArray addObject:newThumb];

    [newThumb release]; // --- doesn't break the app         

}

viewDidUnload和/或dealloc中释放数组。你不需要释放每一个拇指。

答案 3 :(得分:-1)

我们应该始终避免在循环中分配内存。在您的情况下,您应该在使用您创建的对象后立即释放内存。即

for(int i=0; i <totalThumbs; i++){          

   Thumb *newThumb = [[Thumb alloc] initWithImage:someImage];  

   //position the thumbs here, etc.  

   //assume releasing here breaks the app because we need to interact with the thumbs later  
   // [newThumb release] --- breaks the app  
   // Work with newThumb  
   [newThumb release];
}  

通过这样做,每次循环运行时都会释放对象。实际上,每次循环运行时,都会创建一个新对象。这是您在循环中管理内存分配的方法。

干杯!