Проблема с утечкой памяти в iPhone? - PullRequest
0 голосов
/ 26 января 2011

Я хочу получить некоторые утечки памяти в своем коде, как я могу исправить утечку памяти.

dashboard  = [[NSMutableArray alloc] init];
[dashboard addObject:[[NSDictionary alloc]  initWithObjectsAndKeys:@"demo_1.jpg",@"pic_source",@"  Head",@"Title",nil];   // memory leaks here. 


if ( theConnection ) {
    receiveData = [[NSMutableData data] retain]; //memory leaks here.
}

Но я выпустил dealloc - в [receiveData release];; но утечки памяти произошли.Я знаю, сохранить, счет увеличен, но как я могу опубликовать данные правильно.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 26 января 2011

я думаю, что ваша утечка в строке:

[dashboard addObject:[[NSDictionary alloc]  initWithObjectsAndKeys:@"demo_1.jpg",@"pic_source",@"  Head",@"Title",nil]; 

просто измените ее на

[dashboard addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"demo_1.jpg",@"pic_source",@"  Head",@"Title",nil]; 

addObject сохраняет объект, чтобы вы могли использовать удобные методы создания, которые автоматически высвобождают объект, который они создают.

и другая возможная утечка ... если вы определили свой receiveData как свойство с атрибутом retain, вам не нужно явно вызывать retain.Вы можете позвонить self.recieveData = [NSMutableData data].Это сохранит это.Конечно, вам все еще нужно будет выпустить его в dealloc.

РЕДАКТИРОВАТЬ, чтобы показать код:

NSMutableArray *anArray = [[[NSMutableArray alloc] init] autorelease];
 [sections setValue:anArray forKey:display_date];
2 голосов
/ 26 января 2011

dashboard addObject:[[NSDictionary alloc] initWithObjectsAndKeys:@"demo_1.jpg",@"pic_source",@" Head",@"Title",nil]; Вы вызвали метод init - тогда вы являетесь владельцем объекта.Когда вы помещаете его в массив - вызывается и retain.Просто позвоните в автосервис, чтобы устранить утечку.

receiveData = [[NSMutableData data] retain]; - если вы позвоните release, этот объект будет удален, когда он выходит из области видимости.Если вы напишите

receiveData = [NSMutableData data];

Он будет автоматически удален при выходе за рамки

РЕДАКТИРОВАТЬ

Если вы используете методы с initЕсли вы указали в них слово, то вы являетесь владельцем таких объектов, и они не будут автоматически удаляться, пока вы не вызовете для них метод release.Если вы не хотите владеть объектом, создайте его статическим методом.Например:

NSMutableArray *array = [NSMutableArray arrayWithObjects: ... , nil];

Это то же самое, что и вызов

NSMutableArray *array = [[[NSMutableArray alloc] initWithObjects: ... , nil] autorelease];

Авто-релиз означает, что объект получит метод release, когда он выходит из области видимости - и если он не был сохранен, будетудаляется автоматически

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