NSArray和NSMutableArray的CFType?

时间:2014-04-29 00:19:40

标签: ios objective-c nsmutablearray nsarray cftypes

我们正在努力使固定数组(及其所有固定组件,在几个级别中)可变,并且似乎唯一的方法是迭代嵌套固定数组中的所有级别并创建可变对象使用arrayWithArraymutableCopy

进行一些研究我发现NSArrayNSMutableArray在使用CFgetCFType()函数时返回相同的值(int 19)。

附件是示例代码

NSArray *array = @[@"one", @"two"];
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:array];
int id1 = CFGetTypeID((__bridge CFTypeRef)(array));
int id2 = CFGetTypeID((__bridge CFTypeRef)(mutableArray));
NSLog(@"Type: %i Type: %i", id1, id2);

为什么两个结构类型都返回相同的CFTypeID?这是否意味着NSMutableArray的可变性隐藏在CFMutableArrayRef的不透明定义中?

2 个答案:

答案 0 :(得分:2)

NSArray有很多非常复杂和无证的行为。它有一些疯狂的东西来提高现实世界的表现。

NSArrayNSMutableArray的高级行为已被充分记录,但这两个类实际上并不存在,而是获得其他类的实例,您实际获得的类将取决于启发式决策框架将基于数组中的实际数据以及您如何访问它。

在开始修改数组之前,创建数组的副本可能实际上不会复制。即便如此,它可能永远不会复制,它可能会保留原始阵列并保持已经发生的变化的增量。

如果您需要知道发生了什么,那么您根本不应该使用NSArray。相反,你应该放弃到C数组,甚至可能NSMutableData(当内容可能太大而无法容纳在RAM中时,提示:NSMutableData很棒。)

您看到的特定行为可能随时发生变化,具体取决于操作系统版本,甚至可能是您的应用正在执行的硬件。不要依赖NSArray在实践中的工作方式,因为这是不可预测的。而是依赖文档。任何未记录的内容都不可信,尤其是NSArray这是一个特殊的案例类。

此外,永远不要继承NSArray。而是创建一个在内部使用NSArray的包装类。

答案 1 :(得分:1)

我做了一些粗略的测试。看起来CFTypeID对于任何数组都是相同的:大/小,静态/运行时生成,以及可变/不可变。如果我不得不猜测,我猜测NSArray / CFArrayRef群集类组中的所有类都使用相同的CFTypeID。

没关系。这是一个您无法依赖的实施细节。