Есть ли веская причина, почему я не должен делать что-то подобное? Пример:Где разница между [MyClass alloc] и [[self class] alloc]?
У меня есть класс MyClass. В там у меня есть эта реализация:
- (id)copyWithZone:(NSZone*)zone {
MyClass *copy = [[MyClass allocWithZone:zone] init];
copy.someproperty = [[self.someproperty copy] autorelease];
return copy;
}
Вместо этого, я нашел фрагмент кода, который выглядит следующим образом:
- (id)copyWithZone:(NSZone*)zone {
MyClass *copy = [[[self class] allocWithZone:zone] init];
copy.someproperty = [[self.someproperty copy] autorelease];
return copy;
}
Разница заключается в том, что первый раз использует имя, если его собственный класс по-человечески читаемым, как если бы это был какой-то другой класс. А второй спрашивает себя, для какого класса. Разве это имеет значение, или они в полной мере используются в этом случае?
Итак, внутри класса, когда вы хотите создать экземпляр того же класса, следует всегда вызывать [[self class] alloc] вместо [TheClass alloc]? – 2009-08-16 07:11:38
Это зависит от того, должен ли подкласс работать с этим методом. В -copyWithZone: подкласс может вызвать ваш метод через супер, выполнить дополнительную конфигурацию, а затем вернуть результат. Поэтому использование [self class] является предпочтительным. – 2009-08-16 17:21:21
Подкласс не обязательно должен вызывать его через супер. если подкласс не имеет каких-либо дополнительных переменных, он мог бы просто наследовать его без какой-либо дополнительной работы. – user102008