вложенность «alloc» с помощью сеттера в Objective-C - PullRequest
0 голосов
/ 08 февраля 2010

Первый вопрос здесь, это касается iPhoneOS3, а не MacOSX. Я довольно новичок в Objective-C, и я никогда не разрабатывал в среде без автоматической сборки мусора, поэтому меня это немного смущает. Вот некоторый допустимый код, назначающий контроллер представления делегату приложения из примера с Apple.com:

MyViewController *aViewController = [[MyViewController alloc]
    initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];
[self setMyViewController:aViewController];
[aViewController release];

Итак, из того, что я понимаю, я должен выпустить aViewController , потому что он сначала выделен (+1 = 1); затем сохраняется в установщике (+1 = 2); затем освобождается в сеттере (-1 = 1); и затем больше не нужен, так что, наконец, снова освобождается (-1 = 0) и память освобождается. Не могли бы я не пропустить назначение временного объекта aViewController и вложить эти функции следующим образом:

[self setMyViewController:[[MyViewController alloc]
    initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]]];

Мне было интересно, будет ли это работать правильно? Я немного волнуюсь, так как сеттер требует указатель на ViewController, а не просто его копию. И так как я передаю только возвращаемое значение, собирается ли указатель на ViewController в установщике указывать на данные, которые могут быть удалены или потеряны до того, как он сможет их назначить? Прошу прощения, если это кажется глупым вопросом, но мне трудно найти ответ где-нибудь, и я пытаюсь найти хорошие методы для сред без сбора мусора. Спасибо!

Ответы [ 3 ]

1 голос
/ 08 февраля 2010

Не думайте об управлении памятью с точки зрения абсолютного количества сохраняемых данных. Думайте об этом полностью с точки зрения владения и инкапсуляции.

Когда вы alloc объект, вы создали объект, которым вы владеете. Когда вы устанавливаете этот объект как значение для другого объекта, этот другой объект должен сохранить объект для выражения владения. Если ваш код больше не интересуется объектом, вам следует release (или autorelease, если вы хотите вернуть его чему-то другому).

[self setMyViewController:[[MyViewController alloc]
    initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]]];

Чтобы ответить на ваш конкретный вопрос, приведенная выше строка кода сама по себе вызовет утечку памяти при условии, что -setMyViewController: реализован правильно .

1 голос
/ 09 февраля 2010

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

MyViewController *aViewController = [[[MyViewController alloc]
    initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]] autorelease];
[setMyViewController:aViewController];

Спасибо за помощь, ребята!

0 голосов
/ 08 февраля 2010
[self setMyViewController:[[MyViewController alloc]
    initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]]];

здесь вы выделяете, затем он сохраняется, так что сразу у вас есть счетчик сохранения 2. но он будет установлен правильно, так как вы все равно передаете установщику указатель на контроллер представления.

Если бы свойство MyViewController относилось к типу assign (not retain), то счетчик сохранения был бы только 1.

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