Cocoa框架中的属性拷贝是什么意思(就像UITabBar的items属性)

在UITabBar.h,一个propery签名的副本

@属性(非primefaces,复制)NSArray *项目; //获取/设置可见

这是一个数组而什么是“复制”的意思? 复制NSArray容器obj? 复制每个obj NSArray包含? 或者其他的东西。

所以有一个testing

UITabBar* testBar = [[UITabBar alloc] init]; UITabBarItem* item = [[UITabBarItem alloc] init]; NSArray* array = [[NSArray alloc] initWithObjects:item, nil]; NSLog(@"bar:%p,%d", testBar, testBar.retainCount); NSLog(@"item:%p,%d", item, item.retainCount); NSLog(@"array:%p,%d", array, array.retainCount); testBar.items = array; NSLog(@"that item:%p,%d", [testBar.items lastObject], [[testBar.items lastObject] retainCount]); NSLog(@"testBar.items:%p,%d", testBar.items, testBar.items.retainCount); 

结果

酒吧:0x96a9750,1

项目:0x96aa230,2

arrays:0x96aa280,1

该项目:0x96aa230,2

testBar.items:0x96aa280,6

为什么既不是容器arrays也不obj被“复制”?

在这种情况下复制的原因是NSArray不可变的 。 您不需要复制它以防止对数组的更改,因为无法进行这些更改。 保留相同的不变数组就足够了。

如果你用NSMutableArray尝试这个实验,你会得到不同的结果。

两件事情:

  • collections – -copy总是很浅。 它不会复制集合元素(事实上,没有什么能保证这些元素甚至是可复制的 – 即符合NSCopying协议)。 这解释了为什么obj不被复制 – 它没有得到任何额外的保留。

  • 基金会尽可能地优化其实施 – -copy-retain 。 例如, -[NSString copy]是不可变string的保留。 由于集合副本很浅,所以同样的优化对于不可变集合起作用。 这就是为什么array不被复制,只是保留。