所以我已经使用 Objective-C 编程一年多了,但我似乎无法理解属性的用途。我在互联网上搜索了几次,但从未真正找到一个好的解释。我了解如何创建它们:
@property (something, something) something *variableName;
@syntheize variableName;
但是我应该让我所有的实例变量属性。对我来说,据我所知,这似乎是在浪费代码。但是当我在线查看代码时,有时我会在一个类中看到 25 个属性。我认为这是一种浪费。我唯一一次使用它们是在将信息从选定的 UITableView
单元格传递到详细信息 viewController
时。为此,我使用:
@property (copy) NSString *myString;
您能否也解释一下:nonatomic
、copy
、retain
、assign
等是什么意思。
谢谢
最佳答案
这些属性是创建 getter 和 setter 的便捷方法。
大气与非原子
假设您正在@synthesizing
方法实现,原子与非原子改变生成的代码。如果您正在编写自己的 setter/getter,atomic/nonatomic/retain/assign/copy 仅供引用。
对于 atomic,合成的 setter/getter 将确保整个值始终从 getter 返回或由 setter 设置,而不管任何其他线程上的 setter 事件。也就是说,如果线程 A 在 getter 的中间,而线程 B 调用 setter,一个实际可行的值——一个自动释放的对象,很可能——将返回给 A 中的调用者。
在非原子中,没有这样的保证。因此,非原子比原子快得多。
atomic 不做的是对线程安全做任何保证。如果线程 A 正在同时调用 getter,而线程 B 和 C 使用不同的值调用 setter,则线程 A 可能会获得返回的三个值中的任何一个——调用任何 setter 之前的值或传递给 setter 的任何一个值在 B 和 C 中。同样,对象可能以 B 或 C 的值结束,无法判断。
确保数据完整性——多线程编程的主要挑战之一——可以通过其他方式实现。
分配、保留、复制
简而言之,assign vs retain vs copy 决定了合成访问器如何与 Objective-C 内存管理方案交互:
- assign 是默认值,只是执行变量赋值
- 保留指定应发送新值 - 分配时保留,旧值发送释放
- copy 指定应发送新值 - 在赋值时复制并发送旧值释放。
请记住,保留是在创建的对象上完成的(它会增加引用计数),而复制会创建一个新对象。那么,区别在于您是要向对象添加另一个保留还是创建一个全新的对象。
关于iphone - 为什么使用属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7374573/