iPhone SDK: утечка памяти при присвоении значений свойств? - PullRequest
0 голосов
/ 10 августа 2011

У меня есть утечка в классе connectionDidFinishLoading, как это можно исправить?

enter image description here

@property (nonatomic,retain) NSMutableData *responseXMLData;
@property (nonatomic,copy) NSMutableData *lastLoadedResponseXMLData;

-(void)dealloc {
[responseXMLData release] ;
responseXMLData=nil;
[lastLoadedResponseXMLData release];
lastLoadedResponseXMLData=nil;
[super dealloc];
}

Ответы [ 3 ]

1 голос
/ 11 августа 2011
@property (nonatomic,copy) NSMutableData *lastLoadedResponseXMLData;

Поскольку вы работаете с изменяемым объектом, который собираетесь устанавливать и изменять, вам следует использовать RETAIN:

@property (nonatomic,retain) NSMutableData *lastLoadedResponseXMLData;

retain - «Указывает, что retain должна вызываться для объекта при назначении. ... Предыдущему значению отправляется сообщение об освобождении». Таким образом, вы можете себе представить назначение экземпляра NSString (который является объектом и который вы, вероятно, хотите сохранить).

copy - «Указывает, что копия объекта должна использоваться для присвоения. ... Предыдущему значению отправляется сообщение об освобождении». В основном то же, что и retain, но отправка -copy, а не -retain.

Вот хорошее прочтение о различных методах get / set, которые вы можете указать @ property / @ synthesize для создания: http://cocoawithlove.com/2010/06/assign-retain-copy-pitfalls-in-obj-c.html

1 голос
/ 10 августа 2011

вы не сказали нам, где вы создаете объект для responseXMLData?где бы вы ни инициализировали, этот объект должен выпустить это

self.responseXMLData = [[NSMutuableData alloc]init]autorelease];

, а в вашем методе dealloc вы могли бы просто сказать

-(void)dealloc {

    self.responseXMLData = nil; //which is equivalent to [responseXMLData release]; responseXMLData=nil;
}

и

0 голосов
/ 10 августа 2011

Просто мысль, по вашему:

self.lastLoadedResponseXMLData = nil;
self.lastLoadedResponseXMLData = self.responseXMLData;

До того, как один выпуск произойдет в dealloc, может ли быть возможно, что вы просто установили nil и скопируете следующий responseXMLData в lastLoadedResponseXMLData без освобождения предыдущих копий?

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