为什么使用属性?

所以我已经在Objective-C编程了一年多了,我似乎无法理解对属性的使用。 我已经search了几次互联网,但从来没有真正find一个很好的解释。 我明白如何创build它们:

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

但是,我应该做所有我的实例variables属性。 对我来说,从我所知道的来看,这似乎是对代码的浪费。 但是当我在网上查看代码时,有时候我会在一个类中看到25个属性。 我认为这是浪费。 我唯一使用它们的时间是从一个UITableView单元格传递信息到一个详细的viewController 。 为此,我使用:

 @property (copy) NSString *myString; 

你还可以解释一下: nonatomiccopyretainassign等的意思。

谢谢

这些属性是创buildgetter和setter的便捷方法。


Atmoic v非primefaces

假设你在@方法实现方法,primefaces与非primefaces更改生成的代码。 如果你正在编写你自己的setter / getters,atomic / nonatomic / retain / assign / copy只是build议性的。

使用primefaces,合成的setter / getter将确保整个值始终从getter返回或由setter设置,而不pipe其他线程上的setter活动。 也就是说,如果线程A位于getter的中间,而线程B调用setter,则实际的可用值 – 最有可能的自动释放对象 – 将在A中返回给调用者。

在非primefaces,没有这样的保证。 因此,非primefaces比primefaces快得多。

什么primefaces不做就是保证线程安全。 如果线程A同时调用getter和线程B和C调用不同值的setter,则线程A可能会返回三个返回值中的任何一个值 – 在任何setter被调用之前的值或者传入setters的任一值在B和C中。同样,对象可能以B或C的值为结束,无法分辨。

确保数据完整性 – multithreading编程的主要挑战之一 – 是通过其他方式实现的。


分配,保留,复制

简而言之,assign vs retain vs copy决定了合成访问器如何与Objective-C内存pipe理scheme进行交互:

  • assign是默认值,只是执行variables赋值
  • 保留指定新的值应该发送 – 保留在赋值和旧值发送释放
  • copy指定应该发送的新值 – copy赋值和旧值发送释放。

请记住,保留是在创build的对象上完成的(它增加了引用计数),而复制则创build一个新的对象。 所不同的是,你是否想添加另一个保留到对象或创build一个全新的对象。

属性是揭示价值的好方法。 你不应该公开所有的实例variables,因为这会破坏良好的OOP封装。

这是苹果关于此事的文件。

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html

关键是:

声明的属性通过提供以下function来解决标准访问器方法的问题:

  • 属性声明提供了访问方法如何工作的清晰明确的规范。
  • 根据您在声明中提供的规范,编译器可以为您合成访问器方法。 这意味着你有更less的代码来编写和维护。
  • 属性在语法上表示为标识符,并且是有作用域的,所以编译器可以检测到未声明的属性的使用。

属性启用variables的自动处理。 所以当你做一个综合的时候,编译器会生成你的getter和setter,允许一个做class.variableName = value(表示编译器会执行[class variableName:value]。

这里的属性相当不错的解释: http : //cocoacast.com/?q=node/103

如果你需要getter和setter来暴露一些实例variables,或者你想要一些自动保留/释放内存pipe理或线程安全访问器,那么属性是一个不那么冗长的方式来自动创build这些聪明的getter和setter。 如果你不想暴露一个对象或线程以外的东西,而不希望运行时内存pipe理(比如对于一些malloc'd C结构体),那么属性可能是浪费的,或者是语法糖(可能会也可能不会提高代码的可读性),或者由不知道差异的编码人员来完成。

这些属性是一个很好的function,通过综合给你getter和setter方法,并通过不设置和获取值给你解除。

属性可以被声明为“只读”,并且可以被提供有诸如“分配”,“复制”或“保留”的存储语义。 默认情况下,属性被认为是primefaces的,这会导致一个锁,防止多个线程同时访问它们。 一个属性可以被声明为“非primefaces”,它可以删除这个锁(参考http://en.wikipedia.org/wiki/Objective-C#Properties )。