iphone - 为什么使用属性?

标签 iphone objective-c ios ipad properties

所以我已经使用 Objective-C 编程一年多了,但我似乎无法理解属性的用途。我在互联网上搜索了几次,但从未真正找到一个好的解释。我了解如何创建它们:

@property (something, something) something *variableName;
@syntheize variableName;

但是我应该让我所有的实例变量属性。对我来说,据我所知,这似乎是在浪费代码。但是当我在线查看代码时,有时我会在一个类中看到 25 个属性。我认为这是一种浪费。我唯一一次使用它们是在将信息从选定的 UITableView 单元格传递到详细信息 viewController 时。为此,我使用:

@property (copy) NSString *myString;

您能否也解释一下:nonatomiccopyretainassign 等是什么意思。

谢谢

最佳答案

这些属性是创建 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/

相关文章:

ios - 获取引用文件夹 ios 中子目录的名称

ios - 1 px 边框 UIBezierPath(roundedRect :byRoundingCorners:)

ios - Swift 如何创建从根 VC 到嵌入式 VC 的协议(protocol)委托(delegate)

iphone - 根据用户请求杀死 iOS 应用程序

iphone - 如何访问WiFiManager Framework iOS?

iPhone 长 plist

iphone - 以编程方式在按钮上添加图像和文本

objective-c - 如何检查 NSOperationQueue 是否完成以及是否有任何操作失败?

iphone - objective-c,如何在 UIAlertView 上添加 UITextField

ios - 使用自动布局修复自定义 UITableViewCell