не все геттеры принимают эту форму:
- (id)variable { return variable; }
... это просто самая примитивная форма.одни только свойства должны предлагать больше комбинаций, которые изменяют реализацию.Примитивный метод доступа, приведенный выше, не учитывает идиомы, используемые в сочетании с управлением памятью, атомарностью или семантикой копирования.реализация также хрупка в переопределениях подклассов.
следуют некоторые действительно короткие примеры;Очевидно, что все становится более сложным в реальных программах, где реализации становятся значительно более сложными.
1) получатель может не вернуть переменную экземпляра.одна из нескольких возможностей:
- (NSObject *)a { return [[a copy] autorelease]; }
2) установщик может не сохранять переменную экземпляра.одна из нескольких возможностей:
- (void)setA:(NSObject *)arg
{
...
a = [arg copy];
...
}
3) в итоге вы реализуете управление памятью во всей вашей программе, что затрудняет обслуживание.семантика класса (и как он обрабатывает подсчет ссылок переменных экземпляра) должна быть сохранена в классе и следовать соглашениям для ожидаемых результатов:
- (void)stuff:(NSString *)arg
{
const bool TheRightWay = false;
if (TheRightWay) {
NSMutableString * string = [arg mutableCopy];
[string appendString:@"2"];
self.a = string;
[string release];
// - or -
NSMutableString * string = [[arg mutableCopy] autorelase];
[string appendString:@"2"];
self.a = string;
}
else {
NSMutableString * string = [arg mutableCopy];
[string appendString:@"2"];
self.a = string;
[self.a release];
}
}
несоблюдение этих простых правил делает ваш код трудным для пониманияподдерживать и отлаживать и мучительно расширять.
, так что если коротко, вы хотите, чтобы ваша программа была проста в обслуживании.вызов метода release непосредственно для свойства требует, чтобы вы знали много контекста внутренней работы класса;это явно плохо и пропускает сильные идеалы хорошего OOD.
он также ожидает, что авторы / субклассеры / клиенты точно знают, как класс отклоняется от соглашения, что глупо и отнимает много времени, когда возникают проблемы, и вам придется заново изучатьвсе внутренние детали, когда возникают проблемы (они будут возникать в какой-то момент).
- это тривиальные примеры того, как вызов release для результата свойства создает проблемы.многие проблемы в реальном мире гораздо сложнее и труднее найти.