Все еще любопытно об управлении памятью в Objective C - PullRequest
0 голосов
/ 19 марта 2011

В классе, производном от UIViewController, есть реализация сообщения, которая обращается к производному свойству view следующим образом:

- (void) doSomethingOnView
{
  MyView *v = (MyView *) [self view];
  [v doOnView:YES];
  [v release];
}

Согласно быстрой документации по представлению свойств UIView, это неатомарное свойство чтения-записи в режиме сохранения. Мои книги здесь (например, «Начало разработки iPhone 4» Марка, Наттинга, Ламарша) читают, что при чтении свойств в режиме сохранения требуется выпуск по полученной ссылке.

Но мой анализатор жалуется на [v release] с «Неправильным уменьшением счетчика ссылок объекта, который в данный момент не принадлежит вызывающей стороне». Где моя вина?

Ответы [ 4 ]

2 голосов
/ 19 марта 2011

В первой строке MyView *v - это просто указатель, который указывает на свойство, уже принадлежащее вашему UIViewControllwer. У вас UIViewController есть это по наследству. Он объявлен в другом месте, а не вами, поэтому он не alloc издан вами.

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

Так что дело в том, не звоните [v release];.

1 голос
/ 19 марта 2011

Рассмотрим следующий код:

self.view = anotherView;

Тогда, если view является свойством, которое объявлено как retain, anotherView будет неявно сохранено.

Это работает, когдавы присваиваете переменную.

В вашем коде:

  1. Вы не используете свойства (т. е. точечная запись)
  2. Вы не присваиваете какую-либо переменную
  3. Вы пытаетесь освободить то, что не выделяете сами с помощью alloc, например

Попробуйте снова прочитать Объявленные свойства и Руководство по управлению памятью разделов документации Apple по Objective-Cесли это не ясно.

0 голосов
/ 19 марта 2011

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

В этом случае вам не нужно сообщать, потому что не было отправлено alloc или retain v.

0 голосов
/ 19 марта 2011

Вы не alloc просмотр, поэтому вам не нужно выпускать его.

Где в книге вы читаете, что в этом случае нужен релиз?

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