【发布时间】:2014-12-06 06:16:34
【问题描述】:
我有一个应用程序在 iPhone 4s 上使用相机时收到内存警告。我在使用之前缩放图像。
+ (UIImage*)simpleImageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize
{
// Create a graphics image context
UIGraphicsBeginImageContext(newSize);
// Tell the old image to draw in this new context, with the desired
// new size
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
// Get the new image from the context
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
// End the context
UIGraphicsEndImageContext();
// Return the new image.
return newImage;
}
我读到你应该从这里使用 NSAutoreleasePool http://wiresareobsolete.com/2010/08/uiimagepickercontroller/
所以我修改了这样的代码:
+ (UIImage*)simpleImageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize
{
//http://wiresareobsolete.com/2010/08/uiimagepickercontroller/
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Create a graphics image context
UIGraphicsBeginImageContext(newSize);
// Tell the old image to draw in this new context, with the desired
// new size
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
// Get the new image from the context
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
// End the context
UIGraphicsEndImageContext();
[newImage retain];
[pool release];
// Return the new image.
return newImage;
}
内存警告消失了。我没有在单独的线程上调用它。 这个 NSAutoreleasePool 在做什么?我只是不明白。
我可以在本地 NSAutoreleasePool 中保留一个对象吗?
NSAutoreleasePool释放后我可以使用保留的对象吗?
重要的问题:NSAutoreleasePool 的这种特定用法如何帮助我的应用程序占用内存,使其不会收到内存警告?
【问题讨论】:
-
现代形式是
@autoreleasepool... 通常情况下,当池耗尽时会释放具有零保留计数的自动释放对象,因此在耗尽池时强制释放。显式的retain应该生成警告/错误... -
newImage 的显式保留不会导致警告/错误。
-
你没有使用 ARC?
-
这些天你需要把这些信息放在前面。无论如何,我不是您正在使用的 API 的专家,但我想 UIGraphicsEndImageContext 会将一些保留计数降至零,并且显式池耗尽会立即释放这些对象。没有池,释放不会立即发生。
-
无论您是否使用 ARC,您都应该使用
@autoreleasepool块而不是NSAutoreleasePool对象。使用NSAutoreleasePool对象确实已经过时了。
标签: ios objective-c nsautoreleasepool