iOS属性声明澄清

Jac*_*nkr 21 properties class ios

这是希望,我可以一个问题的两个部分了解更多的话题.

1)在我看来,你有两个流行的用于声明属性的选项objective c.一种是将属性添加到标题的类主体中,例如.

@interface MyClass : NSObject {
    NSArray *myArray;
}
Run Code Online (Sandbox Code Playgroud)

或者你也可以在以后添加它@interface的身体和之前@end的语句,像这样.

@interface MyClass : NSObject {
    //
}

@property (nonatomic, retain) NSArray *myArray;
Run Code Online (Sandbox Code Playgroud)

这两种"风格"之间有什么区别?你何时选择其中一种?

2)在@property你找到诸如的选项之后(nonatomic, retain).那些是什么以及为什么/何时使用不同的选项?

Ric*_*III 47

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

  • nonatomic (不强制对属性进行线程安全,主要是在整个程序中只使用一个线程时使用)
  • atomic (对属性强制执行线程安全,主要用于在整个程序中使用多个线程时)(默认)
  • retain/ strong(自动保留/释放set上的值,确保值不会意外解除分配)(默认情况下,如果ARC和对象类型)
  • readonly (不能设置属性)
  • readwrite (可以设置和获取属性)(默认)
  • assign/ unsafe_unretained(不应对此属性进行内存管理,由分配值的人员手动处理)(默认情况下,如果不是ARC或对象类型)
  • copy (在设置之前复制对象,如果值集不能因外部因素(字符串,数组等)而改变.
  • weak (如果对象被释放,则自动将引用置零,并且不保留传入的值)
  • getter=method (设置用于获取此属性值的选择器)
  • setter= method (设置用于设置此属性值的选择器)

  • 这只是答案的第2部分.西蒙的回答讨论了第1部分. (3认同)

Sim*_*mon 29

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)告诉编译器,以及内存管理应该如何工作,以及如何实现这些方法.请注意,您实际上从未真正看到这些访问者,但请确保它们已存在并准备好供您使用.

要阅读有关该主题的更多信息,我建议您阅读以下教程中的第9节"属性" 或购买涵盖Objective-C简介的书籍.

您还应该熟悉至少以下属性:

  • 访问
    • 选择readwrite(默认)或readonly.如果readonly设置,则只有getter方法可用.
  • 二传手内存管理
    • assign(默认),只需指定新值.您最有可能只将其用于原始数据类型.
    • retain,释放旧值并保留新值.如果使用垃圾收集器,retain则相当于assign.为什么?旧值的手动释放将由垃圾收集器完成.
    • copy将复制新值并释放旧值.这通常与字符串一起使用.
  • 穿线
    • atomic(默认)将确保setter方法是原子的.这意味着只有一个线程可以一次访问setter.
    • nonatomic,当你不使用线程时使用它.

这篇文章为您提供了很好的内存管理介绍assign,retain以及copy.

  • 嘿嘿,老实说我觉得`Richard J. Ross III`对于像我这样的非读者来说有一个更简洁的答案.但是我确实把你当作+1,因为你显然在你的答案中付了很多努力.另外,我在询问为什么我没有接受你的答案时会看到*商业概念*,但我认为要求某人接受你的回答是*"推迟"*.关于这个话题,我确信每个人都是*不同*.无论如何,这是我的双重意识. (2认同)