1

在 NSObject 协议中声明了保留。

因此 NSObject 类和 NSProxy 类实现了它。

然而 NSProxy 和 NSObject 类都有一个 alloc。

为什么在 NSObject 协议中没有声明 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

干杯

4

1 回答 1

2

我认为这是由 Objective-C 的要求和实现的要求决定的。

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

一个类可以符合 NSCopying 协议,以表明该类的实例可以被复制。通常,您不想复制一个类,因此没有在那里定义类方法。但是,有时您不知道对象是类还是实例,但conformsToProtocol:无论哪种方式调用都会返回相同的值。通过创建一个同名的类方法,copyWithZone:即使您不知道是否有实例或类,您也知道调用是安全的。

于 2011-08-24T00:20:58.307 回答