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
不被复制,只是保留。