Как решить эту утечку памяти (iPhone)? - PullRequest
0 голосов
/ 31 июля 2009

Как освободить эту переменную без EXC_BAB_ACCESS?

//First line create memory leak
UIImage *ImageAvatar =  [[UIImage alloc] initWithData:[myg.imageData copy]];
Moins1 = ImageAvatar;
//[ImageAvatar release]; if i release-> EXC_BAD_ACCESS

Moins1 - это интерфейс интерфейса, объявленный так:

UIImage *Moins1;
...
@property (nonatomic, retain)   UIImage         *Moins1;

Ответы [ 4 ]

2 голосов
/ 31 июля 2009

Похоже, проблема не в UIImage, а в NSData. В Какао любой метод copy (или mutableCopy) возвращает объект со счетом сохранения +1, что означает, что вы являетесь его владельцем и, следовательно, несете ответственность за его освобождение.

В своем коде вы вызываете -copy для myg.imageData, но никогда не выпускаете его. Это классический пример утечки памяти. Вот что я бы сделал, чтобы это исправить, плюс немного изменив синтаксис:

Ивар:

UIImage *Moins1;
@property (nonatomic, retain) UIImage *Moins1;

реализация:

NSData * imageData = [myg.imageData copy];
UIImage * ImageAvatar = [[UIImage alloc] initWithData:imageData];
[imageData release];
[self setMoins1:ImageAvatar];
[ImageAvatar release];
0 голосов
/ 10 октября 2012
-(void )dealloc
  {
   if(self.Moins1!=nil)
     {
      self.Moins1 = nil;
     }
   }

Посмотрите, когда вы даете и возражаете свойство retain, его счет уже равен 1, и когда вы выделяете его, его счет становится равным 2, поэтому, когда вызывается dealloc, он проверит, равен ли его ноль, а если нет, то равен 0. Таким образом это даст счет удержания переменной 0

0 голосов
/ 04 августа 2009

В вашем коде есть две проблемы. Копирование imageData, как указано другими участниками, и присвоение полю Moins1 без сохранения объекта.

Присвоение Moins1 доступа к полю напрямую, поэтому вам нужно будет сделать свое собственное сохранение. Если вы не сохраните его и не освободите его в следующей строке, любой доступ к полю с подпоследовательностью приведет к ошибке защиты.

Вы можете использовать свойство для назначения:

UIImage *ImageAvatar = 
    [[UIImage alloc] initWithData:[[myg.imageData copy] autorelease]];
self.Moins1 = ImageAvatar;
[ImageAvatar release];

Или вы также можете сделать это в одну строку:

self.Moins1 = [UIImage imageWithData:[[myg.imageData copy] autorelease]];
0 голосов
/ 31 июля 2009

Вам не нужно отправлять -copy объекту NSData. UIImage не хранит ссылку на данные, а просто читает их и создает изображение. Отправка -copy без -release - утечка памяти.

Однако это не объясняет EXC_BAD_ACCESS. Происходит что-то еще, а не из кода, который вы опубликовали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...