我对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];我知道NSMutableArray和NSArray之间的区别,我并不是在寻找它们之间的差异。我只是想知道该代码如何在没有错误的情况下编译/执行。
发布于 2015-05-05 13:30:44
[[NSArray alloc] init]返回一个空的、不变的数组。没什么好奇怪的。你还会从一个方法返回什么意思是“没有项目?”
编译器如何知道它在RAM中的对象数或大小
对象计数为0。它是空的。它在内存中的大小是一个空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行,通过调用NSArray创建一个完全不同的sortedArrayUsingDescriptors:。然后将sortedArray指向该对象。弧形看到你不再指向空数组,并释放它。(同样,优化细节在这里跳转,实际步骤可能不同,但效果将是相同的。)
这里的正确代码是:
// ... Code that sets up sortDescriptors ...
NSArray *sortedArray = [sortedContainers sortedArrayUsingDescriptors:sortDescriptors]; 现在,在非常现代的ObjC中,您将不会经常看到[[NSArray alloc] init]被写出。编写@[]更容易(这实际上只是方法调用的语法糖)。但是在将数组文字添加到语言之前,[[NSArray alloc] init]或[NSArray array]是相当常见的。
发布于 2015-05-05 12:51:22
如果您只是在没有给出任何大小和任何对象的情况下插入NSArray,那么它在生命周期内将保持为空。NSArray是不可变的
如果您的问题是关于NSMutableArray的,请阅读here at the SO
https://stackoverflow.com/questions/30053443
复制相似问题