首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSObject为什么在NSObject和NSProxy中都声明了alloc,但在NSObject协议中却保留了

NSObject为什么在NSObject和NSProxy中都声明了alloc,但在NSObject协议中却保留了
EN

Stack Overflow用户
提问于 2011-08-24 07:51:44
回答 1查看 683关注 0票数 1

retain在NSObject协议中声明。

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

然而,NSProxy和NSObject类都有一个分配。

为什么在NSObject协议中没有声明alloc?

附带问题:当实例方法在NSObject类中时,NSObject协议也用于存储方法的类版本。有什么方法可以阻止在NSObject协议中声明类和实例吗?为什么要把他们分开?

代码语言:javascript
复制
@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

干杯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-24 08:20:58

我认为这是由Objective-C所要求的以及实现所要求的。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7168884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档