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熟悉以下属性:
- 访问
- select
readwrite
(默认)或readonly
。 如果readonly
,则只有getter方法可用。
- select
- Setter内存pipe理
-
assign
(默认),只需分配新的值。 你最可能只使用这与原始数据types。 -
retain
,释放旧的价值并保留新的价值。 如果使用垃圾收集器,retain
等同于assign
。 为什么? 旧值的手动释放将由垃圾收集器完成。 -
copy
将复制新值并释放旧值。 这通常与string一起使用。
-
- 穿线
-
atomic
(默认)将确保setter方法是primefaces的。 这意味着只有一个线程可以立即访问setter。 -
nonatomic
,当你不使用线程时使用它。
-
这篇文章给你一个很好的介绍内存pipe理和assign
, retain
和copy
。
属性基本上是访问器方法。 他们定义variables的范围。 第一种情况如上所述,variables不能在其他类中访问,而通过在第二种情况下声明属性,variables也可以在其他类中访问。 而且,它们对内存pipe理也很有用。
第一个是私人宣言,如果你没有定义第二个,那么其他class级将不能访问。 其次是在.m模块中和@synthesize一起使用,setter / getter是编译器为你创build的。 你仍然可以用这个定义你自己的getter或setter。 在这种情况下,@property中定义的所有iVar都可以被其他类访问。保留/释放操作是自动完成的。 您应该阅读Apple文档以获取更多详细信息。 请检查: primefaces和非primefaces属性之间有什么区别?
属性基本上是访问器方法。 他们定义variables的范围。 默认情况下,variables的访问权限受到保护 ,属性将其Specifier从protected设置为Public