iOS属性声明澄清

时间:2012-02-06 15:54:41

标签: ios class properties

这是一个两部分问题,希望我能了解有关该主题的更多信息。

1)在我看来,您有两个热门选项,用于在objective c中声明的属性。一种是将属性添加到标题的类体中,例如。

@interface MyClass : NSObject {
    NSArray *myArray;
}

或者您可以在@interface正文之后和@end声明之前添加它

@interface MyClass : NSObject {
    //
}

@property (nonatomic, retain) NSArray *myArray;

这两种“风格”之间的区别是什么?你何时选择一种?

2)在@property之后找到(nonatomic, retain)等选项。什么是为什么/何时你使用不同的选项?

5 个答案:

答案 0 :(得分:47)

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

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

答案 1 :(得分:28)

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

要阅读有关该主题的更多信息,我建议您阅读以下Tutorial中有关属性的第9部分,或购买涵盖Objective-C简介的Book

此外,您应该至少熟悉以下属性:

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

This post为您提供了有关内存管理和assignretaincopy的详细介绍。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

如果您没有定义第二个,那么第一个将是私有声明,其他类将无法访问。第二个与.m模块中的@synthesize一起使用,编译器为您创建了setter / getter。您仍然可以使用此定义自己的getter或setter。在这种情况下,@ property中定义的所有iVars都可以被其他类访问。​​恢复/释放操作是自动完成的。 您应该阅读Apple文档以获取更多详细信息。 请检查: What's the difference between the atomic and nonatomic attributes?

答案 4 :(得分:0)

属性基本上是存取方法。它们定义变量的范围。默认情况下,变量的访问权限受保护,属性将其说明符从受保护设置为公共