gpt4 book ai didi

ios - NSArray 分配和初始化

转载 作者:行者123 更新时间:2023-11-28 18:57:59 31 4
gpt4 key购买 nike

我对 NSArray 初始化有点困惑。令人困惑的是我们有不同的 init 方法来初始化它,如果我只是初始化它而不给出任何大小和任何对象,编译器如何知道它在 RAM 中的对象计数或大小>。init 方法背后的逻辑/区别是什么?任何人都可以简要解释一下吗?

编辑:

NSArray *sortedArray = [[NSArray alloc] init];
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"quota" ascending:NO];
NSArray *sortDescriptors = [NSArray arrayWithObject:descriptor];
//How is that possible to modifying to immutable object
sortedArray = [sortedContainers sortedArrayUsingDescriptors:sortDescriptors];

我知道 NSArrayNSMutableArray 之间的差异,但我并没有寻找差异。我只是想知道该代码如何可以无错误地编译/执行。

最佳答案

[[NSArray alloc] init] 返回一个空的、不可变的数组。这并不奇怪。您还会从方法返回什么来表示“没有项目?”

how compiler knows it object count or size in RAM

对象计数为 0。它是空的。它在 RAM 中的大小是空 NSArray 的大小。 NSArray 是一个对象,因此它有一些标准的 objc_object 开销,以及一些 NSArray 的实例变量。

也就是说,作为一个实现细节,Cocoa 对此进行了优化,并始终为所有空 NSArray 对象返回相同的单例。您可以通过以下方式证明这一点:

NSArray *a = [[NSArray alloc] init];
NSArray *b = [[NSArray alloc] init];
NSLog(@"%p", a);
NSLog(@"%p", b);
if (a == b) { // Pointer equality, not isEqual:
NSLog(@"Same object");
}

那么,这是在做什么?

NSArray *sortedArray = [[NSArray alloc] init]; // (1)
// ... code that doesn't matter ...
sortedArray = [sortedContainers sortedArrayUsingDescriptors:sortDescriptors]; // (2)

在第 1 行,您创建了一个局部指针变量 sortedArray 并将其指向一个空数组(它恰好是一个单例,但这是一个优化细节)。

在第 2 行,您通过调用 sortedArrayUsingDescriptors: 创建了一个完全不同的 NSArray。然后将 sortedArray 指向该对象。 ARC 发现您不再指向空数组,并释放它。 (再次强调,优化细节跳到这里,实际步骤可能不同,但效果是一样的。)

这里正确的代码是:

// ... Code that sets up sortDescriptors ...
NSArray *sortedArray = [sortedContainers sortedArrayUsingDescriptors:sortDescriptors];

现在,在非常现代的 ObjC 中,您不会经常看到 [[NSArray alloc] init] 被写出来。编写 @[] 更容易(这实际上只是方法调用的语法糖)。但是在数组文字被添加到语言之前,[[NSArray alloc] init][NSArray array] 相当普遍。

关于ios - NSArray 分配和初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30053443/

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