retain在NSObject协议中声明。
因此NSObject类和NSProxy类实现它。
但是NSProxy和NSObject类都有一个alloc。
为什么在NSObject协议中声明了isnt alloc?
附带问题: 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
干杯
答案 0 :(得分:2)
我认为这取决于Objective-C所需要的内容,以及实现所需的内容。
要创建对象,您需要一种方法来分配它。这是通过alloc
方法完成的。由于这需要使用objective-c,因此暗示所有根对象都应该实现它。但是,内存管理不必通过引用计数来完成。您可以使用垃圾收集。因此,retain
方法不需要使用objective-c。 Apple的实现创建了retain
方法作为内存管理的一种形式。他们希望确保所有对象都可用,因此他们将其添加到NSObject协议中。 Cocoa中的所有根类都应符合该协议,因此它们都应该有retain
方法。
类可以符合NSCopying协议,以显示可以复制该类的实例。通常,您不希望复制类,因此没有在那里定义类方法。但是,有时您不知道对象是类还是实例,但调用conformsToProtocol:
将返回相同的值。通过创建一个名称相同的类方法,您知道即使您不知道自己是否有实例或类,也可以安全地调用copyWithZone:
。