Могу ли я освободить объект (созданный в методе) в другом методе (без сохранения) в задаче C? - PullRequest
0 голосов
/ 23 ноября 2010

Могу ли я освободить объект (созданный в методе) в другом методе (без сохранения) в цели C?

Мой код выглядит следующим образом

- (NSMutableDictionary *) returnningMyMutableDictionary {

NSMutableDictionary * myDict = [[NSMutableDictionary alloc] init];

[myDict setObject: @ "My Name" forKey: @ "name"];

[myDict setObject: @ "99" forKey: @ "age"];

return myDict;

}

- (Недействительными) mainmethod {

NSMutableDictionary * dict = [self returnningMyMutableDictionary];

NSLog(@"dict %@",dict);

dict = nil;

[dict release];

}

Q1) Является ли хорошей практикой выпускать возвращаемый словарь в "mainmethod"?

Q2) Когда я запускаю приложение в приборе, я получаю утечку в следующей части.

[myDict setObject: @ "My Name" forKey: @ "name"];

Как избежать утечки памяти здесь?

Пожалуйста, помогите мне .. Заранее спасибо за помощь.

Ответы [ 3 ]

4 голосов
/ 23 ноября 2010
  1. авто-релиз из первой функции.

    return [autoDlease myDict];

  2. не назначать dict для nil до Вы отпускаете это.Это ваша утечка памяти.На самом деле, теперь он автоматически выпущен, вообще не выпускайте его.

1 голос
/ 23 ноября 2010

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

Может показаться, что это неслучай в вашем примере, но если вы посмотрите между строк, mainmethod - это метод, который запрашивает новый NSMutableDictionary.

В этом смысле вы должны следовать шаблону именования , добавляяnew / alloc в вашем методе, ответственном за создание нового объекта.

Обычно вы сохраняете объект и освобождаете его в dealloc, но это не всегда так.

В общем, избегайтес помощью автоматического выпуска, если вы можете освободить объект.

-(NSMutableDictionary *)allocMutableDictionary
{
    NSMutableDictionary *myDict = [[NSMutableDictionary alloc] init];
    [myDict setObject:@"My Name" forKey:@"name"];
    [myDict setObject:@"99" forKey:@"age"];

return myDict;
}

-(void)mainmethod
{
    NSMutableDictionary *dict = [self allocMutableDictionary];

    NSLog(@"dict %@",dict);

    dict = nil; //making the dict nil means you don't actually release it in the next line
    [dict release];
}
1 голос
/ 23 ноября 2010

альтернативное решение

- (NSMutableDictionary *) returnningMyMutableDictionary {

NSMutableDictionary * myDict = [[[NSMutableDictionary alloc] init] autorelease];

и теперь Алекс говорит, что сначала правильно выпустить объект, затем присвоить nil;

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