Если вы вызываете методы с именами 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, прежде чем оно будет присвоено свойству, поэтому оно будет освобождено до того, как будет передано свойству.