将非NSObject添加到NSMutableArray

jba*_*100 13 reference-counting objective-c foundation nsarray ios

最近的SO 讨论使我感到困惑.NSMutableArray原型addObject:

- (void)addObject:(id)anObject
Run Code Online (Sandbox Code Playgroud)

id在objc.h中定义为

typedef struct objc_class *Class;
typedef struct objc_object {
    Class isa;
} *id; 
Run Code Online (Sandbox Code Playgroud)

当我将一个NSObject或子类添加到一个时NSMutableArray,它的保留计数会递增,当我从中删除它时,NSMutableArray它会递减.这是否意味着如果一个id type不是一个NSObject或一个子类被添加到一个NSMutableArray,它必须响应保留和释放消息?这个定义id似乎并不强迫这一点.它是一个客观的C指令,任何人id type都应该响应标准的内存管理消息吗?

zne*_*eak 7

关于大多数Foundation容器(以及大多数Apple开发的类,以及大多数由第三方开发的类)的严格事实是,当一个方法接受该id类型时,它应该真正读取id<NSObject>,这意味着任何响应NSObject协议.不属于NSObject层次结构的类的实例不太可能响应,-retain并且-release在尝试将它们添加到容器时尤其不方便.他们也不太可能回应-hash,-isEqual:,-description,-copy,和所有其他方法基金会容器可以在其内容使用无论出于何种原因.

例如,如果您尝试将Class对象添加到Foundation容器中(除了NSMapTable这个设计时考虑到了很多灵活性),您将会碰壁,因为"现代"ObjC类应该继承NSObject,或者至少实施NSObject协议.

不过,这是一种非常罕见的情况.Class几乎是唯一有用的类,它不会继承NSObject.