У меня есть приложение, которое получает предупреждение о памяти при использовании камеры на iPhone 4s. Я масштабирую изображение, прежде чем использовать его.Понимание NSAutoreleasePool
+ (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' ... в общем, то, что происходит, когда пул сливается, заключается в том, что объекты с автореализацией с нулевым количеством удержания освобождаются, поэтому вы вынуждаете dealloc при сливе пула. Явное 'сохранение' должно генерировать предупреждение/ошибку ... – stevesliva
Явное сохранение newImage не вызывает предупреждения/ошибки. –
Вы не используете ARC? – stevesliva