Где разница между [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;
}

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

Ответ 1

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