首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSArray alloc和init

NSArray alloc和init
EN

Stack Overflow用户
提问于 2015-05-05 12:48:44
回答 2查看 3.8K关注 0票数 0

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

编辑:

代码语言:javascript
复制
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];

我知道NSMutableArrayNSArray之间的区别,我并不是在寻找它们之间的差异。我只是想知道该代码如何在没有错误的情况下编译/执行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-05 13:30:44

[[NSArray alloc] init]返回一个空的、不变的数组。没什么好奇怪的。你还会从一个方法返回什么意思是“没有项目?”

编译器如何知道它在RAM中的对象数或大小

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

尽管如此,作为实现细节,Cocoa对此进行了优化,并始终为所有空NSArray对象返回相同的单例。您可以通过以下方式演示这一点:

代码语言:javascript
复制
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");
}

那么,这是干什么呢?

代码语言:javascript
复制
NSArray *sortedArray = [[NSArray alloc] init]; // (1)
// ... code that doesn't matter ...
sortedArray = [sortedContainers sortedArrayUsingDescriptors:sortDescriptors]; // (2)

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

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

这里的正确代码是:

代码语言:javascript
复制
// ... Code that sets up sortDescriptors ...
NSArray *sortedArray = [sortedContainers sortedArrayUsingDescriptors:sortDescriptors]; 

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

票数 4
EN

Stack Overflow用户

发布于 2015-05-05 12:51:22

如果您只是在没有给出任何大小和任何对象的情况下插入NSArray,那么它在生命周期内将保持为空。NSArray是不可变的

如果您的问题是关于NSMutableArray的,请阅读here at the SO

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30053443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档