gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:58:25 25 4
gpt4 key购买 nike

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

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

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

所以有一个测试

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 都没有被“复制”?

最佳答案

有两件事:

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

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

关于objective-c - 属性复制在Cocoa框架中意味着什么?(如UITabBar的items属性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12031793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com