NSObject, почему alloc объявлена ​​как в NSObject, так и в NSProxy, но сохраняется в протоколе NSObject

Сохранение объявлено в протоколе 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 ответ

Решение

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

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

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

Другие вопросы по тегам