iOS财产声明澄清

这是一个两部分的问题,希望我能更多地了解这个话题。

1)在我看来,你有两个stream行的选项来为objective c声明一个属性。 一个是将该属性添加到标头的类体中,例如。

 @interface MyClass : NSObject { NSArray *myArray; } 

或者你可以在@interface后面和@end语句之前添加它。

 @interface MyClass : NSObject { // } @property (nonatomic, retain) NSArray *myArray; 

这两种“风格”之间有什么区别?你们什么时候select一种?

2)在@property之后,你可以find像(nonatomic, retain)这样的选项。 那些为什么为什么/何时使用不同的select?

以下是Xcode可识别的唯一属性修饰符:

  • nonatomic (在属性上不强制执行线程安全,主要用于在整个程序中只使用一个线程的情况)
  • atomic (在属性上强制执行线程安全,主要用于在整个程序中使用多个线程时使用)(默认)
  • retain / strong (自动保留/释放设置的值,确保值不会意外释放)(默认如果ARC和对象types)
  • readonly (不能设置属性)
  • readwrite (可以设置和获取属性)(默认)
  • assign / unsafe_unretained (不应该用这个属性进行内存pipe理,它由赋值的人员手动处理)(如果不是ARC或者对象types,则默认处理)
  • copy (在设置它之前复制对象,在由于外部因素(string,数组等等)而不能改变该值的情况下)。
  • weak (如果对象被解除分配,自动清零参考,不保留传入的值)
  • getter=method (设置用于获取此属性值的select器)
  • setter= method (设置用于设置此属性值的select器)

1)@property是定义getter和setter方法的一种特殊方式,或者我们称之为Objective-C中的访问器。 你的第一个片段只是声明一个你必须自己声明和写入访问器的数组。 例如setMyArray:myArray
使用@property将为您声明您的访问器,相当于自己声明setMyArray:myArray 。 从Objective-C 2.0开始,声明访问器是首选方法。 请注意,你仍然必须自己声明属性(在你的情况myArray)。

2)你首先需要了解@synthesize。 记住@property声明你的属性的访问器,@synthesize会执行它们。 当你在@interface中使用@property时,你可能会在@implementation中写一个@synthesize。 使用@synthesize相当于实现了setMyArray:myArray
属性(nonatomic, retain)告诉编译器等内存pipe理应该如何工作,以及如何实现这些方法。 请注意,您从来没有真正看到这些访问器,但可以放心,他们在那里,准备好使用。

要阅读关于这个主题的更多信息,我build议阅读下面的教程阅读第9节的属性,或者购买一本介绍Objective-C的书籍 。

你也应该至less熟悉以下属性:

  • 访问
    • selectreadwrite (默认)或readonly 。 如果readonly ,则只有getter方法可用。
  • Setter内存pipe理
    • assign (默认),只需分配新的值。 你最可能只使用这与原始数据types。
    • retain ,释放旧的价值并保留新的价值。 如果使用垃圾收集器, retain等同于assign 。 为什么? 旧值的手动释放将由垃圾收集器完成。
    • copy将复制新值并释放旧值。 这通常与string一起使用。
  • 穿线
    • atomic (默认)将确保setter方法是primefaces的。 这意味着只有一个线程可以立即访问setter。
    • nonatomic ,当你不使用线程时使用它。

这篇文章给你一个很好的介绍内存pipe理和assignretaincopy

属性基本上是访问器方法。 他们定义variables的范围。 第一种情况如上所述,variables不能在其他类中访问,而通过在第二种情况下声明属性,variables也可以在其他类中访问。 而且,它们对内存pipe理也很有用。

第一个是私人宣言,如果你没有定义第二个,那么其他class级将不能访问。 其次是在.m模块中和@synthesize一起使用,setter / getter是编译器为你创build的。 你仍然可以用这个定义你自己的getter或setter。 在这种情况下,@property中定义的所有iVar都可以被其他类访问。​​保留/释放操作是自动完成的。 您应该阅读Apple文档以获取更多详细信息。 请检查: primefaces和非primefaces属性之间有什么区别?

属性基本上是访问器方法。 他们定义variables的范围。 默认情况下,variables的访问权限受到保护 ,属性将其Specifier从protected设置为Public