Освобождение объекта возвращается в правильном направлении? - PullRequest
3 голосов
/ 02 мая 2011

Если я создаю объект внутри функции и возвращаю его, когда и где я должен освободить этот объект?Вот пример, где я создаю объект.

- (NSDictionary*) sampleFunction
{
    NSMutableDictionary* state = [[NSMutableDictionary alloc] initWithCapacity:5];

    [state setObject:[[NSNumber alloc] initWithInt:self.a]  forKey:@"a"];
    [state setObject:[[NSNumber alloc] initWithInt:self.b] forKey:@"b"];
    [state setObject:[[NSNumber alloc] initWithInt:self.c] forKey:@"c"];

    return state;
}

Дополнительный вопрос: чтобы избежать утечек памяти, я также должен выпустить выделенные здесь номера NSN?Как бы выглядел этот код без утечек памяти?

1 Ответ

1 голос
/ 02 мая 2011

Во-первых, вы должны обратиться к этому руководству по всем правилам:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

... не принимайте то, что люди говорят здесь, как Евангелие.Существуют некоторые исключения и странные правила, которые разъяснит руководство, на которое я ссылался выше.

Теперь, относясь к вашему примеру: в общем говоря, каждый раз, когда вы alloc что-то делаете, вы должны его выпустить.Когда вы возвращаете значение из метода, оно должно быть autoreleased (99% времени. Есть пара исключений: видите, ничего не легко!).Apple для удобства предоставляет несколько автоматически выпущенных методов - у NSNumber есть один из них.

Я собираюсь показать вам ваш код выше, но переписанный для использования этих автоматически выпущенных методов:

- (NSDictionary*) sampleFunction
{
    NSMutableDictionary* state = [NSMutableDictionary dictionaryWithCapacity:5];

    [state setObject:[NSNumber numberWithInt:self.a]  forKey:@"a"];
    [state setObject:[NSNumber numberWithInt:self.b] forKey:@"b"];
    [state setObject:[NSNumber numberWithInt:self.c] forKey:@"c"];

    return state;
}

Как я уже говорил, вы также можете использовать autorelease с alloc/init:

NSMutableDictionary* state = [[[NSMutableDictionary alloc] initWithCapacity:5]autorelease];

Опять же, документ Apple, на который я ссылался выше, - это best место для переходадля ответов на вопросы по управлению памятью.

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