Хорошо, вот сделка.
Когда вы определяете свойство, как так ...
@property (nonAtomic, retain) NSString myName;
... из-за невозвратов собственности повелевать его на самом деле, как определение его как:
@property (nonAtomic, readwrite, retain, getter=getMyName,setter=setMyName) NSString myName;
При использовании @synthesize myName;
за кулисами, компилятор генерирует метод геттера, который выглядит примерно так:
-(void) setMyName:(NSString *) aString{
if (!(myString==aString) { //test if a string is the same **object** as the current myString
if (aString != nil) { // if nil we don't want to send a retain
[aString retain]; // increment the retain count by one
}
[myString release]; //decrement the retain count of the currently assigned string by one.
myString=nil; //set the pointer to nil to ensure we don't point to the old string object
myString=aString; //assign the newly retained object to the myString symbol
}
}
Как вы можете видеть, любая строка из любого источника любого ранее сохраненного счета, автореализованная или нет, будет автоматически сохранена методом при назначении и при назначении нового значения будет автоматически выпущена методом. Несколько присваиваний не будут складывать счетчик сохранения. Пока вы используете сгенерированный сеттер, назначенный объект (в данном случае aString) всегда будет иметь счет сохранения, который сохранит его в классе.
Вот почему вы можете сделать это ...
self.myName=[NSSting stringWithFormat:@"%@ is correct.", @"TechZen"]
;
без того, чтобы сделать это:
self.myName=[[NSSting stringWithFormat:@"%@ is correct.", @"TechZen"] retain];
... и не придется беспокоиться, если значение строки внезапно исчезают, когда autoreleasepool водостоки.
Однако, если вы когда-нибудь позвонить ...
[self.myName release];
... где-нибудь за пределами dealloc
, то объект в собственность моей быть nilled, если вы не отслеживать его неотступно. Точно так же, если вы позвоните ..
[self.myName retain];
... в любом месте, то объект в собственность будет течь (возможно, даже после того, как объект само было высвобождены.)
Вот почему я говорю, никогда не сохранять или autorelease какой-либо объект, назначенный или скопированы в собственность. Это не только бессмысленно, но и контрпродуктивно. Из этого следует, что вы хотите только вызывать освобождение по свойству, когда вы закончите с самообъектом, потому что эффективное отслеживание счета удержания с помощью setter означает, что вы можете потерять свойство, даже если вам все еще нужно.
Autorelease никогда не требуется для свойства, поскольку свойство всегда сохраняется самообъектом, и любой другой объект должен обрабатывать внутреннее хранение, если он использует свойство собственного объекта.
Как только вы понимаете, что происходит внутри сгенерированных аксессуаров, правила очевидны. Никогда не сохраняйте объект свойства явно. Никогда не отпускайте объект объекта в dealloc. Никогда не проверяйте объект объекта.
Очевидным следствием этих правил всегда является использование ссылок self.propertyName внутри объекта self, чтобы гарантировать автоматическое управление сохранением свойства.
На вашем EDIT 1, счет сохранения мудрых, они одинаковы. Эти объекты сохраняются только один раз. В ВСЕХ удобных функциях есть неявный авто-релиз. Если вы не видите слово alloc в инструкции init, переменная автореализована. Если вы используете alloc, вы должны использовать autorelease –