Не могу понять, почему здесь утечка памяти - PullRequest
3 голосов
/ 18 августа 2010

У меня есть следующий блок, который вызывает у меня проблемы с инструментом повышения производительности: В частности, он говорит, что STObject протекает.Я не уверен, почему?

for (NSDictionary *message in messages)
{
    STObject *mySTObject = [[STObject alloc] init];

    mySTObject.stID = [message valueForKey:@"id"];

    [items addObject:mySTObject];
    [mySTObject release]; mySTObject = nil;

} 
[receivedData release]; receivedData=nil;
[conn release]; conn=nil;

ОБНОВЛЕНИЕ:

items is @property (nonatomic, retain), это приведет к тому, что счет удержания будет +2?

Ответы [ 4 ]

6 голосов
/ 18 августа 2010

Если вы добавляете что-то в NSArray или NSDictionary, но оно сохраняется, ваш mySTObject сохраняется, то есть он все еще существует, когда вы делаете - отпускаете, а затем устанавливаете его равным nil. Удалите объект из хранилища, где он хранится, и ваша «утечка» исчезла.

4 голосов
/ 18 августа 2010

Есть ли у вас переменные / свойства, хранящиеся в STObject?Если вы это сделаете, вам нужно будет освободить их методом "- (void) dealloc" STObject.В противном случае, хотя STObject освобожден, переменные, принадлежащие STObject, не будут освобождены.

Примером метода dealloc будет:

- (void)dealloc {
    [stID release];
    [myVar2 release];
    [myVar3 release];
    [super dealloc];
}

Также убедитесь, что вы вызываете [super dealloc] в конце метода.

0 голосов
/ 27 августа 2010

Если у вас 10.6, у Xcode есть «build and analysis», который, на мой взгляд, является очень хорошим инструментом для устранения утечек памяти.Документация доступна здесь

0 голосов
/ 18 августа 2010

Вы устанавливаете mySTObject равным нулю после его освобождения ...

        [mySTObject release]; mySTObject = nil;

просто удалить mySTObject = nil; Я думаю, что это должно быть ..

...