Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 通过mutableCopy或arrayWithArray使用文字创建NSMutableArray:_Objective C_Cocoa_Memory Management_Objective C Literals - Fatal编程技术网

Objective c 通过mutableCopy或arrayWithArray使用文字创建NSMutableArray:

Objective c 通过mutableCopy或arrayWithArray使用文字创建NSMutableArray:,objective-c,cocoa,memory-management,objective-c-literals,Objective C,Cocoa,Memory Management,Objective C Literals,可能重复: 根据介绍ObjectiveC文本的WWDC视频,NSMutableArrays可以如下初始化: [NSMutableArray arrayWithArray:@[]]; 但如果我们这样做会怎么样: [@[] mutableCopy]; 我知道一个正在初始化数组,另一个只是提供一个浅拷贝;因此,内存管理是不同的。但是如果我们使用ARC,使用后者的缺点是什么?它更贵吗?ARC处理这两个问题的方式可能不同,但我只是想知道使用mutableCopy是否“更糟糕”。在前一种情况下,您最终

可能重复:

根据介绍ObjectiveC文本的WWDC视频,
NSMutableArray
s可以如下初始化:

[NSMutableArray arrayWithArray:@[]];
但如果我们这样做会怎么样:

[@[] mutableCopy];

我知道一个正在初始化数组,另一个只是提供一个浅拷贝;因此,内存管理是不同的。但是如果我们使用ARC,使用后者的缺点是什么?它更贵吗?ARC处理这两个问题的方式可能不同,但我只是想知道使用
mutableCopy
是否“更糟糕”。

在前一种情况下,您最终会在当前的自动释放池中添加两个对象:NSArray文本和从中创建的NSMutableArray。在后者中,文本NSArray被添加到autorelease池中,但从中复制的NSMutableArray没有。因此,就性能而言,第一种情况稍差,因为耗尽自动释放池(例如,在运行循环周期结束时)需要连续释放两个对象,而在第二种情况下,副本将与自动释放的文本分开释放。实际上,时差是无穷小的。

有趣!这解释了很多。谢谢。在ARC下,不必要的自动释放通常会被优化掉,所以即使这样也不太可能是主要问题。事实并非如此。上次我测试的时候,基金会似乎没有用ARC编译。这一点很重要,因为使用ARC编译时,clang不会插入
return[retVal autorelease]-它实际插入
returnobjc\u autoreleaseReturnValue(retVal)。同样,调用者(您的代码)不会对结果调用
-retain
,而是调用
objc\u retainAutoreleasedReturnValue
。围绕该方法返回的这两个函数的组合导致对象从未真正进入自动释放池。否则,它仍然会在那里结束。那么
[NSMutableArray]
呢?