最近的 SO discussion让我困惑。 addObject:
的 NSMutableArray 原型(prototype)是
- (void)addObject:(id)anObject
和id
在objc.h中定义为
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
当我将 NSObject 或子类添加到 NSMutableArray
时,它的保留计数会增加,而当我从 NSMutableArray
中删除它时,它会减少。这是否意味着如果将不是 NSObject
或子类的 id type
添加到 NSMutableArray
,它必须响应保留和释放消息? id
的定义似乎并没有强制这样做。任何 id 类型
都应该响应标准内存管理消息,这是一个客观的 C 指令吗?
最佳答案
关于大多数 Foundation 容器(以及大多数 Apple 开发的类,以及大多数第三方开发的类)的硬性事实是,当一个方法接受 id
类型,它真的应该读作 id<NSObject>
,这意味着响应 NSObject
的任何类型协议(protocol)。不属于 NSObject
的类的实例层次结构不太可能响应 -retain
和 -release
,这在尝试将它们添加到容器时尤其不方便。他们也不太可能回应 -hash
, -isEqual:
, -description
, -copy
,以及 Foundation 容器可以出于任何原因对其内容使用的所有其他方法。
例如,如果您尝试添加 Class
对象到 Foundation 容器(NSMapTable
除外,因为这个容器在设计时考虑了很多灵 active ),你会碰壁,因为“现代”ObjC 类应该继承自 NSObject
,或者至少实现 NSObject
协议(protocol)。
不过,这种情况非常罕见。 Class
几乎是唯一没有继承自 NSObject
的有用类.
关于objective-c - 添加非 NSObjects 到 NSMutableArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7905028/