NSObject为什么在NSObject和NSProxy中声明的alloc都在NSObject协议中保留

时间:2011-08-23 23:51:44

标签: iphone ios nsobject nsproxy

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

干杯

1 个答案:

答案 0 :(得分:2)

我认为这取决于Objective-C所需要的内容,以及实现所需的内容。

要创建对象,您需要一种方法来分配它。这是通过alloc方法完成的。由于这需要使用objective-c,因此暗示所有根对象都应该实现它。但是,内存管理不必通过引用计数来完成。您可以使用垃圾收集。因此,retain方法不需要使用objective-c。 Apple的实现创建了retain方法作为内存管理的一种形式。他们希望确保所有对象都可用,因此他们将其添加到NSObject协议中。 Cocoa中的所有根类都应符合该协议,因此它们都应该有retain方法。

类可以符合NSCopying协议,以显示可以复制该类的实例。通常,您不希望复制类,因此没有在那里定义类方法。但是,有时您不知道对象是类还是实例,但调用conformsToProtocol:将返回相同的值。通过创建一个名称相同的类方法,您知道即使您不知道自己是否有实例或类,也可以安全地调用copyWithZone: