很容易理解简单数据的setter / getter的概念,例如NSInteger。
如果我们说:NSInteger a;
“a”的setter改变了a的值,而getter只获取(返回)它的值。然后很容易理解原子/非原子概念,因为原子将保证在被打包时读取“a”总是返回一个整数值(getter和setter是同步的)。
但我不清楚理解的是setter和getter属性是指向对象的指针(例如NSData *,NSString *)。比方说NSMutableData:
如果我们说:NSMutableData * m_my_mutable;
想象一下,这个属性的setter setMyMutable和getMyMutable属于我的对象MyObject。如果我这样做,那么我将调用getter(因为我在添加数据之前得到了对象):
[[MyObject getMyMutable] appendData ....]
但是appendingData也会修改它,因此它不会被视为一个setter动作吗?或者setter只引用了初始化值的事实(例如可以保留)。
在概念中我必须缺少一些东西。
由于 Apple92
答案 0 :(得分:2)
setter设置属性的值。设置整数属性时,将存储新的整数值。设置对象属性时,将存储新对象。 appendData:
不会更改属性 - 它会更改数据对象本身。原子属性只会确保属性保存一些完整的值或其他值 - 它不会影响您对属性内对象的操作。
顺便提一下,拥有可在所拥有对象外部访问的可变状态(例如NSMutableData对象)几乎总是一个坏主意。一旦你这样做,让多个对象都试图做出自己的改变并相互踩踏就变得太容易了。
答案 1 :(得分:0)
设置确实只是指初始化。这就是原子性不足以确保可变数据结构是线程安全的原因。相反,你得到的保证是,对象只会被一次性替换或读取,所以你不会最终得到部分作业。