cmd丢弃旧的副本啥意思
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cmd丢弃旧的副本啥意思相关的知识,希望对你有一定的参考价值。
在cmd属性里的选项卡里有个丢弃旧的副本还有命令记录的缓冲器大小和数量是什么意思啊?修改了对cmd有什么影响?
那命令记录里的缓冲区大小默认是50 意思是什么啊? 意思是一条命令最长为50个字符吗?缓冲区数量为5.是存5条已经输过的命令.我看好像不是吧.可以在仔细点不?
Cocoa 框架中的属性副本是啥意思?(如 UITabBar 的 items 属性)
【中文标题】Cocoa 框架中的属性副本是啥意思?(如 UITabBar 的 items 属性)【英文标题】: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 没用。不要叫它。 【参考方案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 是的,我想你说的是重点,容器数组已经已复制,谢谢以上是关于cmd丢弃旧的副本啥意思的主要内容,如果未能解决你的问题,请参考以下文章