- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是 obj-c 开发的新手,但有部分 C 开发背景。这可能是一个菜鸟问题,但我无法在其他地方得到确切的答案。数组和字符串的这些片段与可能的其他类型的对象有什么区别:
NSArray *original = [NSArray arrayWithObjects:someObjects,nil];
//Case 1
NSArray *copy1 = original;
//Case 2
NSArray *copy2 = [NSArray arrayWithArray:original];
对于字符串
NSString *original = @"aString";
//Case 1
NSString *copy1 = original;
//Case 2
NSString *copy2 = [NSString stringWithString:original];
如果我稍后对 copy1 和 copy2 进行更改,它们会反射(reflect)在原始对象上吗?相同的规则是否适用于其他对象类型?
最佳答案
第二个代码片段对 NSString
的作用与第一个代码片段对 NSArray
的作用相同。行为没有区别,因为 Cocoa 中的 NSString
和 NSArray
对象都是不可变的。
当你调用[NSString stringWithString:original]
时,Cocoa 足够聪明,不会创建新对象:这个决定背后的原因是因为 original
无法更改, 您无法将副本与原件区分开来。 [NSArray arrayWithArray:original]
也是如此,因为你得到了相同的实例。
注意:如果 someObjects
是可变的,则可以通过修改对象并查看它是否在其他地方发生变化来区分数组与其深拷贝。但是,arrayWithArray:
方法生成“浅”副本,因此即使数组中的对象是可变的,您也无法检测到差异。
关于Objective-C = 运算符 vs stringWithString/arrayWithArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21883672/
我想看看它是如何创建数组的。如何查看显示其完成方式的 .m 文件? 最佳答案 如@Ken 所述,您看不到源代码(尽管您可以通过 gdb 反汇编该方法)。 该方法本身创建了给定数组的不可变(无法更改)、
这些都在我的应用程序中工作,没有任何明显的区别: 1) theArray = [[NSMutableArray alloc] initWithArray:[NSKeyedUnarchiver unar
我是 obj-c 开发的新手,但有部分 C 开发背景。这可能是一个菜鸟问题,但我无法在其他地方得到确切的答案。数组和字符串的这些片段与可能的其他类型的对象有什么区别: NSArray *origina
当你将 nil 传递给 arrayWithArray: 时会发生什么? 假设我有以下代码: NSMutableArray *myArray = [NSMutableArray arrayWithArr
最近我经常使用数组,我想知道..这两行之间有什么区别。 NSArray *array = [NSArray arrayWithArray:someArray]; 和 NSArray *array =
给定以下代码示例,newMutableArrray 变量是根据两个不同的初始化而不同,还是相同? NSArray *originalArray = @[obj1, obj2, oj3]; NSMuta
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Is literal creation of an NSMutableDictionary less eff
我是一名优秀的程序员,十分优秀!