2014-04-29 122 views
2

我们正在努力使固定数组(及其所有固定组件,在几个级别中)是可变的,似乎唯一的方法是遍历嵌套固定数组中的所有级别并创建mutable对象使用arrayWithArraymutableCopy用于NSArray和NSMutableArray的CFType?

做了一些研究,我发现当使用CFgetCFType()函数时,NSArrayNSMutableArray都返回相同的值(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

NSArray有很多非常复杂和无证的行为。它做了一些疯狂的事情来改善现实世界的表现。

NSArrayNSMutableArray高水平的行为是有据可查的,但是这两个类实际上不存在的,而不是你得到其他类的实例,其中类你实际上将取决于启发式决策的框架将根据实际数组中的数据以及您如何访问它。

创建数组的副本可能实际上并不创建副本,直到您开始修改它。即使如此,它可能永远不会制作副本,它可能会保留原始数组,并保持已做出的变化量的增量。

如果您需要知道发生了什么,那么您根本不应该使用NSArray。相反,你应该下降到C阵列或甚至NSMutableData(小贴士:NSMutableData是真棒,当内容可能太大,不适合内存)。

您看到的特定行为可能随时发生变化,具体取决于操作系统版本,甚至可能是您的应用程序执行的硬件。不要依靠NSArray在实践中的工作方式,因为这是不可预测的。而是依赖于文档。任何未经证明的文件都不可信,特别是NSArray这是一个特例。

此外,从来没有子类NSArray。相反,请创建一个内部使用NSArray的包装类。

1

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

没关系。这是您无法信赖的实施细节。