Я пытаюсь прояснить кое-что в моей голове о реализации copyWithZone:
, может кто-нибудь прокомментировать следующее ...Лучшая практика при реализации copyWithZone:
// 001: Crime is a subclass of NSObject.
- (id)copyWithZone:(NSZone *)zone {
Crime *newCrime = [[[self class] allocWithZone:zone] init];
if(newCrime) {
[newCrime setMonth:[self month]];
[newCrime setCategory:[self category]];
[newCrime setCoordinate:[self coordinate]];
[newCrime setLocationName:[self locationName]];
[newCrime setTitle:[self title]];
[newCrime setSubtitle:[self subtitle]];
}
return newCrime;
}
// 002: Crime is not a subclass of NSObject.
- (id)copyWithZone:(NSZone *)zone {
Crime *newCrime = [super copyWithZone:zone];
[newCrime setMonth:[self month]];
[newCrime setCategory:[self category]];
[newCrime setCoordinate:[self coordinate]];
[newCrime setLocationName:[self locationName]];
[newCrime setTitle:[self title]];
[newCrime setSubtitle:[self subtitle]];
return newCrime;
}
В 001:
Лучше ли написать название класса непосредственно
[[Crime allocWithZone:zone] init]
или использовать[[[self Class] allocWithZone:zone] init]
?Можно ли использовать
[self month]
для копирования iVars или я должен получить доступ к iVars напрямую, то есть_month
?
Какой из этих двух подходов на выбор зависит от того, реализует суперкласс 'NSCopying'. Например, 'NSObject' не делает этого, поэтому вызов' [super copyWithZone: zone] 'будет генерировать исключение. – Costique
Он говорит/Пользователи/ws403216/Рабочий стол/Демо/Демо/Преступление.m: 21: 28: Нет видимого @interface для «NSObject» объявляет селектор «copyWithZone»: «Суперкласс Crime.m в моем случае - NSObject. –
@NitinMalguri Как следует из предыдущего комментария, вы должны вызывать '[super copyWithZone: zone]', если родительский класс поддерживает NSCopying, иначе вы должны вызвать '[[[self class] allocWithZone: zone] init]' и поля для копирования как требуется. – Tony