Причина, по которой вы получаете предупреждение от анализатора, заключается в том, что метод геттера не обязан фактически возвращать тот же объект, который вы передали в установщик.Например, представьте следующий код:
- (void)doSomethingWithAString:(NSString *)aString {
self.myName = [[NSString alloc] initWithFormat:@"%@ the Great", aString];
[self.myName release];
}
Строка создается методом владения (-init...
), поэтому вы владеете ею.Затем вы передали его в собственность myName
, которая вступила во владение.Теперь вам нужно освободить владение, которое вы получили от метода -init...
, что можно сделать, вызвав -release
.Отлично.
Проблема с кодом выше состоит в том, что [self.myName release]
может не выпустить тот же объект, который вы передали в установщик.Представьте, что установщик был реализован следующим образом:
- (void)setMyName:(NSString *)someString {
// Make sure to trim whitespace from my name!
NSCharacterSet *whitespaceSet = [NSCharacterSet whitespaceCharacterSet];
NSString *strippedString = [someString stringByTrimmingCharactersInSet:whitespaceCharacterSet];
[myName autorelease];
myName = [strippedString retain];
}
Обратите внимание, что объект, который вы передали в установщик, - это , а не объект, который был сохранен в резервном иваре.Когда вы звоните [self.myName release]
, вы освобождаете очищенную строку, а не исходную строку.Исходная строка теперь была пропущена, а удаленная строка перевыпущена.
Короче говоря, никогда не предполагает, что получатель возвращает тот же объект, который вы передали установщику .