2012-02-13 5 views
0

если UIImage является autorelease объект, поэтому, когда я анализирую это жалуются, что на 2-й линии ниже есть потенциал утечки сохраняется в image:IOS управления памятью UIImage

NSData *data = [[NSData alloc] initWithContentsOfURL: ImageURL]; 
    UIImage *image = [[UIImage alloc] initWithData: data]; 

    [data release]; 
    // Do we want to round the corners? 
    image = [self roundCorners: image]; 

    // Is it PNG or JPG/JPEG? 
    // Running the image representation function writes the data from the image to a file 
    if([ImageURLString rangeOfString: @".png" options: NSCaseInsensitiveSearch].location != NSNotFound) 
    { 
     [UIImagePNGRepresentation(image) writeToFile: uniquePath atomically: YES]; 
    } 
    else if(
      [ImageURLString rangeOfString: @".jpg" options: NSCaseInsensitiveSearch].location != NSNotFound || 
      [ImageURLString rangeOfString: @".jpeg" options: NSCaseInsensitiveSearch].location != NSNotFound 
      ) 
    { 
     [UIImageJPEGRepresentation(image, 100) writeToFile: uniquePath atomically: YES]; 
    } 

ответ

4

Почему вы говорите, ваш UIImage является autoreleased? Я вижу только

UIImage *image = [[UIImage alloc] initWithData: data]; 

Используйте вместо

UIImage *image = [[[UIImage alloc] initWithData: data] autorelease]; 

В качестве альтернативы вы можете использовать:

UIImage *tmp = [[UIImage alloc] initWithData: data]; 

UIImage *image = [self roundCorners: tmp]; 

[tmp release]; 

(при условии, roundCorners возвращает autoreleased объект).

+1

'- (UIImage *) roundCorners: (UIImage *)' лучше вернуть также автореализованный объект. – smparkes

+0

Так оно и было. Когда я это делаю, приложение вылетает с первого раза, когда приложение загружается только на телефон. Это не сбой в симуляторе. Затем все остальные приложения загружаются с xcode после первого прекрасного. Несмотря на это, это привело к тому, что приложение не удалось отправить в хранилище приложений. – Jesse

+0

Если я возьму autorelease, приложение будет работать так, как должно, устанавливается в первый раз и работает повсюду. Но я беспокоюсь о потенциальной утечке. Когда у меня было настроено autorelease, мне пришлось разрешить зомби выяснить, почему приложение терпит крах, и он заявил: [UIImage release]: сообщение отправлено на освобожденный экземпляр – Jesse

1

В вашем коде на второй строке ваш UIImage не автореализован. Как только вы используете методы alloc/init, вы сохраняете. Использование удобного метода, такого как imageNamed: создает автоматически выпущенный объект.

Смежные вопросы