gpt4 book ai didi

ios - NSArray 和 NSMutableArray 的 CFType?

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:05:26 26 4
gpt4 key购买 nike

我们正在努力使固定数组(及其所有固定组件,在多个级别)可变,似乎唯一的方法是遍历嵌套固定数组中的所有级别并创建使用 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 的不透明定义中?

最佳答案

NSArray 有很多极其复杂和未记录的行为。它做了一些疯狂的事情来提高现实世界的性能。

NSArrayNSMutableArray 的高级行为有很好的文档记录,但这两个类实际上并不存在,取而代之的是你得到其他类的实例,你实际得到的是哪个类将取决于框架将根据数组中的实际数据以及您访问它的方式做出的启发式决策。

创建数组的副本可能不会真正创建一个副本,直到您开始修改它。即便如此,它也可能永远不会制作副本,它可能会保留原始数组并维护已进行更改的增量。

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

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

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com