Что означает «релиз» в этой ситуации на iPhone? - PullRequest
3 голосов
/ 22 июля 2010

Я хочу задать глупый вопрос о приложении для iPhone. Я зеленый из приложения iPhone. Я прочитал следующий код на веб-сайте Apple.

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

И у меня есть вопрос, как это означает «выпуск» в строке 3?

Показывает ли это память ясно? или программа берет на себя управление этим объектом? или другие значения. Большое спасибо.

Ответы [ 2 ]

5 голосов
/ 22 июля 2010

Когда вы что-то alloc что-то получаете, у полученного вами объекта будет счет отсчета 1 - это означает, что этот объект в данный момент кем-то используется, поэтому его не следует удалять из памяти.Если вы вызовете retain для объекта, это увеличит счет сохранения, что означает, что объект используется двумя вещами.Если счет сохранения достигает 0, это означает, что объект больше не используется, и его можно удалить из памяти.Вы можете уменьшить количество сохраняемых объектов, вызвав release для этого объекта.

В вашем примере aViewController равно alloc 'd, а после строки 1 число сохраненных записей равно + 1.

Затем он устанавливается в качестве контроллера представления в строке 2. Таким образом, этот метод становится владельцем объекта, поэтому следует retain использовать его для собственного использования.

Строка 3, нам не нужнобольше ничего общего с контроллером представления, поэтому мы release держим его в руках.Количество сохраненных файлов уменьшается на единицу - и теперь новый владелец может освободить его, когда закончит с ним.

Возможно, вам будет полезно прочитать раздел управления памятью этого учебного пособия.

2 голосов
/ 22 июля 2010

Каждый раз, когда вы вызываете alloc, у вас есть ссылка на возвращаемый объект, и вы должны вызвать release, чтобы указать, что вы больше не собираетесь использовать эту ссылку.

В приведенном выше случаеВы выделили новый контроллер представления и присвоили его свойству вашего класса.Предполагая, что свойство объявлено с опцией retain, свойство получит собственную ссылку на контроллер представления, вызвав для него retain.Так что теперь есть две активные ссылки на него.Свойство в конечном итоге освободит свою ссылку (либо когда ему назначен другой контроллер представления, либо когда ваш класс будет завершен).Но если вы сами не вызовете release, одна ссылка останется, и контроллер представления никогда не будет освобожден.

Короче говоря, вы должны сопоставлять каждый alloc с выпуском, иначе все будет просочиться.

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