为何使用属性?

时间:2011-09-10 20:41:32

标签: iphone objective-c ios ipad properties

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

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

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

@property (copy) NSString *myString;

您还可以解释一下:nonatomiccopyretainassign等等。

由于

5 个答案:

答案 0 :(得分:7)

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


Atmoic v Nonatomic

假设您是@synthesizing方法实现,原子与非原子会更改生成的代码。如果您正在编写自己的setter / getter,则atomic / nonatomic / retain / assign / copy仅仅是建议性的。

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

在非原子能方面,没有这样的保证。因此,非原子比原子快得多。

什么原子不做是对线程安全做出任何保证。如果线程A与线程B同时调用getter并且C调用具有不同值的setter,则线程A可以获得返回的三个值中的任何一个 - 在调用任何setter之前的值或者传递给setter的任一值在B和C中。同样,对象最终可能会得到B或C中的值,无法分辨。

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


分配,保留,复制

简而言之,assign vs retain vs copy确定了合成访问者如何与Objective-C内存管理方案交互:

  • assign是默认值,只是执行变量赋值
  • retain指定应该在分配时发送新值 - 发送旧值并发送旧值
  • copy指定新值应该在分配时发送-copy并且旧值发送释放。

请记住,保留是在创建的对象上完成的(它会增加引用计数),而copy会创建一个新对象。不过,区别在于您是要为对象添加另一个保留还是创建一个全新的对象。

答案 1 :(得分:3)

属性是公开值的好方法。您不应该公开所有实例变量,因为这会破坏良好的OOP封装。

以下是Apple关于此事的文件。

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

关键点是:

  

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

     
      
  • 属性声明提供了清晰明确的规范   访问者方法的行为方式。
  •   
  • 根据编译器,编译器可以为您合成访问器方法   您在声明中提供的规范。这意味着你有   编写和维护的代码更少。
  •   
  • 属性在语法上表示为标识符,并且是   scoped,因此编译器可以检测未声明属性的使用。
  •   

答案 2 :(得分:0)

属性可以自动处理变量。因此,当您进行综合时,编译器将生成您的getter和setter,允许执行class.variableName = value(表示编译器将执行[class variableName:value]。

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

答案 3 :(得分:0)

属性是一个很好的功能,它通过合成自动为你提供getter和setter方法,并通过不设置和获取值来减轻你的负担。

属性可以声明为“只读”,并且可以提供存储语义,例如“assign”,“copy”或“retain”。默认情况下,属性被视为原子属性,这会导致锁定,从而阻止多个线程同时访问它们。属性可以声明为“非原子”,它会删除此锁(从http://en.wikipedia.org/wiki/Objective-C#Properties引用)。

答案 4 :(得分:0)

如果您需要getter和setter来公开某些实例变量,或者您需要一些自动保留/释放内存管理或线程安全访问器,那么属性是一种不那么冗长的方式来自动创建这些智能getter和setter。如果你不想暴露对象或线程之外的东西,并且不想要运行时内存管理(比如,对于某些malloc'd C结构)那么属性可能是浪费或语法糖(可能会也可能不会提高代码可读性),或由不知道差异的编码员放在那里。