2009-08-15 5 views
10

Есть ли веская причина, почему я не должен делать что-то подобное? Пример:Где разница между [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; 
} 

Разница заключается в том, что первый раз использует имя, если его собственный класс по-человечески читаемым, как если бы это был какой-то другой класс. А второй спрашивает себя, для какого класса. Разве это имеет значение, или они в полной мере используются в этом случае?

ответ

10

Если вы используете подкласс MyClass, то второй пример -copyWithZone: возвращает экземпляр подкласса. В первом примере нет, он возвращает экземпляр MyClass.

+0

Итак, внутри класса, когда вы хотите создать экземпляр того же класса, следует всегда вызывать [[self class] alloc] вместо [TheClass alloc]? – 2009-08-16 07:11:38

+0

Это зависит от того, должен ли подкласс работать с этим методом. В -copyWithZone: подкласс может вызвать ваш метод через супер, выполнить дополнительную конфигурацию, а затем вернуть результат. Поэтому использование [self class] является предпочтительным. – 2009-08-16 17:21:21

+0

Подкласс не обязательно должен вызывать его через супер. если подкласс не имеет каких-либо дополнительных переменных, он мог бы просто наследовать его без какой-либо дополнительной работы. – user102008

Смежные вопросы