【问题标题】:what's property copy means in Cocoa's Framework?(like UITabBar's items property)Cocoa 框架中的属性副本是什么意思?(如 UITabBar 的 items 属性)
【发布时间】:2012-08-20 02:54:46
【问题描述】:

在 UITabBar.h 中,一个属性签名的副本

@property(nonatomic,copy) NSArray *items; // 获取/设置可见

这是一个数组 “复制”是什么意思? 复制 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都没有被“复制”?

【问题讨论】:

  • retainCount 没用。不要叫它。

标签: objective-c ios cocoa copy


【解决方案1】:

两件事:

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

  • Foundation 尽可能优化其-copy-retain 的实现。例如,-[NSString copy] 是不可变字符串的保留。由于集合副本很浅,相同的优化适用于不可变集合。这就是为什么array 没有被复制而只是保留的原因。

【讨论】:

  • 只是一个测试表明有时复制一个不可变的字符串甚至不保留,也许操作系统共享某个字符串仅在内存中的一个副本,谢谢
  • 澄清:数组不会总是被复制;只有不可变的可以。如果您尝试将items 设置为可变数组,您会发现它设置为副本。
【解决方案2】:

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

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

【讨论】:

  • bar:0x96b5ae0,1 item:0x96b6560,2 mutable array:0x96b65b0,1 that item:0x96b6560,3 testBar.items:0x96b6610,5 是的,我想你说的是重点,容器数组已经已复制,谢谢
猜你喜欢
  • 2019-09-13
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
相关资源
最近更新 更多