【问题标题】:NSObject why is alloc declared in both NSObject and NSProxy yet retain is in the NSObject protocolNSObject 为什么在 NSObject 和 NSProxy 中都声明了 alloc 而保留在 NSObject 协议中
【发布时间】:2011-08-23 23:51:43
【问题描述】:

在 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

干杯

【问题讨论】:

    标签: iphone ios nsobject nsproxy


    【解决方案1】:

    我认为这取决于 Objective-C 需要什么,以及实现需要什么。

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-19
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      • 2017-06-06
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多