我们正在以一种使固定数组(及其在多个级别上的所有固定组件)可变的方式进行工作,似乎唯一的方法是遍历嵌套固定数组中的所有级别并创建可变对象使用arrayWithArraymutableCopy

做一些研究,我发现当使用NSArray函数时,NSMutableArrayCFgetCFType()返回相同的值(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的不透明定义内?

最佳答案

NSArray具有许多极其复杂且未记录的行为。它做了一些疯狂的事情来提高现实世界的性能。
NSArrayNSMutableArray的高级行为已得到很好的记录,但是这两个类实际上并不存在,而是获得了其他类的实例,您实际获得的类将取决于框架根据数组中的实际数据做出的启发式决策以及您如何访问它。

在开始修改数组之前,创建数组的副本实际上可能不会创建副本。即使这样,它也可能永远不会复制,它可能会保留原始阵列并保持已进行的更改增量。

如果您需要了解发生了什么,那么您根本不应该使用NSArray。相反,您应该使用C数组甚至NSMutableData(提示:当内容可能太大而无法放入RAM时,NSMutableData非常棒)。

您看到的特定行为可能随时更改,具体取决于操作系统版本,甚至您的应用程序所执行的硬件。在实践中不要依赖NSArray的工作方式,因为这是不可预测的。而是依靠文档。任何未记录的内容都不能被信任,尤其是使用NSArray(这是特例类)时。

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

关于ios - CFType用于NSArray和NSMutableArray吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23353379/

10-14 22:38