Нужен ли выпуск для ссылки, которая была переведена из сохранения на объекте автоматического выпуска? - PullRequest
1 голос
/ 09 декабря 2011

Для следующего кода 1 - требуется сохранить для объекта, возвращенного из getFoo;2 - нужен ли релиз для foo в методе func?

- (NSString *)getFoo {
    return [[[NSString alloc] initWithString:@"foo"] autorelease];
}

- (void)func {
    // ??? is the retain needed?
    NSString *foo = [[self getFoo] retain];

    // use foo

    // ??? is the release needed?
    [foo release];
}

Ответы [ 3 ]

2 голосов
/ 09 декабря 2011

Каждый retain должен совпадать с release.

Это говорит о том, что в вашей функции вам не нужно retain * foo, если вы не откладываете его использование. Обычно пул autorelease get получает drain в конце цикла выполнения, поэтому у вас есть время использовать его локально в своей функции.
Но если вы retain, вы должны release.

И вы могли бы сделать это:

return [NSString stringWithString:@"foo];

Это удобный метод, который возвращает вам объект autorelease.

2 голосов
/ 09 декабря 2011

Если вы alloc, copy или retain объект, вам нужно release его.

В вашем примере вам не нужно его сохранять. Но так как вы сделали, вам нужно выпустить его.

1 голос
/ 09 декабря 2011

Код, который вы написали, в порядке. Когда вы распределяете строку, она сохраняется равной 1. Затем вы автоматически высвобождаете строку, которая уменьшит количество сохраняемых данных позже. Вы используете Foo. Тогда вам не нужно выпускать его, так как вы уже автоматически выпустили его: он будет автоматически выпущен позже.

Обратите внимание, что вы можете использовать stringWithFormat или stringWithString для создания строки, которая уже автоматически освобождена.

Это было бы немного аккуратнее.

...