NSObject, почему заменитель объявлен как в NSObject, так и в NSProxy, но сохраняется в протоколе NSObject - PullRequest
1 голос
/ 24 августа 2011

retain объявлено в протоколе NSObject.

Поэтому класс NSObject и класс NSProxy реализуют его.

, но оба класса - NSProxy и NSObject имеют выделение.

Почему не указывается alloc в протоколе NSObject?

Дополнительный вопрос: Протокол NSObject также используется для хранения версии класса метода, где в качестве метода экземпляра находится класс NSObject.Есть ли что-нибудь, чтобы остановить как класс, так и экземпляр, объявленный в протоколе NSObject.Зачем их разделять?

@protocol NSCopying

- (id)copyWithZone:(NSZone *)zone;     //INSTANCE METHOD version of copyWithZone

@end
@interface NSObject <NSObject> {
    Class   isa;
}
...

+ (id)copyWithZone:(NSZone *)zone;     //CLASS METHOD version of copyWithZone

Приветствия

1 Ответ

2 голосов
/ 24 августа 2011

Я думаю, это определяется тем, что требуется Objective-C, а что требуется реализацией.

Чтобы создать объект, вам нужен способ его размещения. Это делается методом alloc. Поскольку это требуется для использования target-c, подразумевается, что все корневые объекты должны его реализовывать. Тем не менее, управление памятью не должно осуществляться путем подсчета ссылок. Вместо этого вы можете использовать сборщик мусора. Из-за этого метод retain не обязателен для использования target-c. Реализация Apple создала метод retain как форму управления памятью. Они хотели, чтобы все объекты были доступны, и добавили его в протокол NSObject. Предполагается, что все корневые классы в Какао соответствуют этому протоколу, поэтому все они должны иметь метод retain.

Класс может соответствовать протоколу NSCopying, чтобы показать, что экземпляры этого класса могут быть скопированы. Обычно вы не хотите копировать класс, поэтому метод класса там не определен. Однако иногда вы не знаете, является ли объект классом или экземпляром, но вызов conformsToProtocol: в любом случае вернет одно и то же значение. Создавая метод класса с тем же именем, вы знаете, что безопасно вызывать copyWithZone:, даже если вы не знаете, есть ли у вас экземпляр или класс.

...