objective-c - 添加非 NSObjects 到 NSMutableArray

标签 objective-c ios nsarray foundation reference-counting

最近的 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/

相关文章:

ios - 无法以美元添加应用内购买价格,在瑞士获得选项,而开发者帐户是德国的

ios - 类似于 Facebook/Google 搜索引擎的索引搜索

ios - 检测整个屏幕上的触摸

ios - 根据值列表对 NSArray 进行排序?

objective-c - 从 NSArray 获取字符串值

ios - 从另一个 NSArray 中的 NSArray 获取对象

iphone - 用于内存管理的 dealloc 与 ViewDidDissapear

ios - 如何在 Objective C 中处理数据库中的特殊字符?

ios - 核心数据 : Fetch and group different entities based on date created

ios - 当我从另一个 View 中退出时,Touch ID 自动触发成功