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
都应该响应标准的内存管理消息吗?
关于大多数Foundation容器(以及大多数Apple开发的类,以及大多数由第三方开发的类)的严格事实是,当一个方法接受该id
类型时,它应该真正读取id<NSObject>
,这意味着任何响应NSObject
协议.不属于NSObject
层次结构的类的实例不太可能响应,-retain
并且-release
在尝试将它们添加到容器时尤其不方便.他们也不太可能回应-hash
,-isEqual:
,-description
,-copy
,和所有其他方法基金会容器可以在其内容使用无论出于何种原因.
例如,如果您尝试将Class
对象添加到Foundation容器中(除了NSMapTable
这个设计时考虑到了很多灵活性),您将会碰壁,因为"现代"ObjC类应该继承NSObject
,或者至少实施NSObject
协议.
不过,这是一种非常罕见的情况.Class
几乎是唯一有用的类,它不会继承NSObject
.
归档时间: |
|
查看次数: |
1110 次 |
最近记录: |