title
автоматически освобождается, а number
просачивается в программу.Чтобы написать полный установщик, вы должны сначала скопировать переданный объект, а затем сделать релиз.
-(void) setNumber:(NSString *)number_in {
if (number == number_in) {
return;
}
NSString *oldValue = number;
number = [number_in copy];
[oldValue release];
self.title = [title stringByAppendingString:number];
}
Причина, по которой сначала выполняется копирование, а затем освобождение, заключается в том, что вызов copy
неизменного объекта может вернуть тот же объект обратно вместо создания новой копии.Таким образом, если setNumber
вызывается дважды с одним и тем же объектом, а number
был сначала освобожден, он становится недействительным, а затем вызов copy
для этого недействительного объекта может вызвать проблемы.
Проверка if
это шаг оптимизации, который вы можете удалить, если хотите.
Кроме того, вы можете проверить эту статью о написании пользовательских сеттеров.
Как @tia и @Пометить отправили, если заголовок всегда зависит от значения числа, тогда заголовок должен быть readonly
свойством.Модифицированный setNumber
может выглядеть следующим образом:
- (void) setNumber:(NSString *)number_in {
if (number == number_in) {
return;
}
NSString *oldNumber = number;
number = [number_in copy];
[oldNumber release];
NSString *oldTitle = title;
title = [title stringByAppendingString:number];
[oldTitle release];
}
Дополнительные проверки могут потребоваться для передачи nil
number_in, например, когда nil
передается stringByAppendingString
, NSInvalidArgumentException
Поднялся.Итак, вот финальная версия этого сеттера с этой проверкой,
- (void) setNumber:(NSString *)number_in {
if (number == number_in) {
return;
}
NSString *oldNumber = number;
number = [number_in copy];
[oldNumber release];
if (number) {
NSString *oldTitle = title;
title = [title stringByAppendingString:number];
[oldTitle release];
}
}