释放多个无法立即释放的对象实例的最佳方法是什么?
例如,如果您要创建一堆缩略图:
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中释放它们是否有意义?
答案 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];
}
通过这样做,每次循环运行时都会释放对象。实际上,每次循环运行时,都会创建一个新对象。这是您在循环中管理内存分配的方法。
干杯!