什么属性复制在Cocoa的框架中意味着什么?(比如UITabBar的items属性)

时间:2012-08-20 02:54:47

标签: objective-c ios cocoa copy

在UITabBar.h中,这是一份符合签名的副本

@property(非原子,复制)NSArray *项目; //获取/设置可见

这是一个数组 什么“复制”意味着什么? 复制NSArray容器obj? 复制每个obj NSArray包含? 什么的。

所以有一个测试

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

数组:0x96aa280,1

该项目:0x96aa230,2

testBar.items:0x96aa280,6

为什么容器数组和数组中的obj都没有被“复制”?

2 个答案:

答案 0 :(得分:2)

两件事:

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

  • 基金会尽可能优化-copy-retain的实施。例如,-[NSString copy]是不可变字符串的保留。由于集合副本很浅,因此相同的优化适用于不可变集合。这就是array未被复制但只是保留的原因。

答案 1 :(得分:1)

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

如果您使用NSMutableArray尝试此实验,则会得到不同的结果。