Распределение памяти в Objective C - PullRequest
0 голосов
/ 25 августа 2010

У меня простой вопрос. Я имел в виду документ «Ваше первое приложение для iOS» от apple. Я обнаружил, что у класса есть свойство myViewController:

@interface applicationClass
{
   MyViewController *myViewController
}

Теперь, чтобы назначить память этому указателю, показан код:

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

Мое сомнение здесь в том, что не так, если это делается следующим образом:

self.myViewController = [[MyViewController alloc]
            initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];

Я не могу найти такой экземпляр, когда свойство присваивается непосредственно во многих документах. Вместо этого выделяется временная память, а затем она сохраняется свойством. Кто-нибудь может направить меня, если я ошибаюсь?

Ответы [ 2 ]

1 голос
/ 25 августа 2010

Если вы вызываете методы с именами alloc или copy, вы получаете объекты со счетом удержания +1 и, следовательно, вы несете ответственность за их освобождение после использования.

Теперь, если выприсвойте свойству, которое определено как @property(retain,...) ..., тогда метод @ synthesize'd позаботится о том, чтобы функции save и release вызывались правильно.Поэтому, если вы сделаете self.foo = bar, то количество сохраняемых баров увеличится на единицу.

Здесь вы получили объект с сохраняемым количеством 1 из вашего alloc / init.Затем вы присваиваете это свойству, и количество сохранений увеличивается до 2, что слишком много (у вас есть только одна ссылка на него, а не две).Два решения: либо первый кодовый блок, который вы процитировали, он сохраняет объект в переменной и может затем вызвать release, чтобы немедленно «исправить» счет сохранения до 1 снова.Или вы можете сделать это:

self.myViewController = [[[MyViewController alloc] initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]] autorelease];

autorelease будет следить за тем, чтобы в дальнейшем вызывался release для объекта, таким образом снова "фиксируя" счет удержания.Вы не можете заменить autorelease with release` здесь, так как количество сохранений упадет до 0, прежде чем оно будет присвоено свойству, поэтому оно будет освобождено до того, как будет передано свойству.

0 голосов
/ 25 августа 2010

При этом вы сохраняете свой объект дважды: в себе. (если вы установили retain в свойстве couse) и в [MyViewController alloc]. Вы хотите сохранить объект только один раз ....

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