这是一个两部分问题,希望我能了解有关该主题的更多信息。
1)在我看来,您有两个热门选项,用于在objective c
中声明类的属性。一种是将属性添加到标题的类体中,例如。
@interface MyClass : NSObject {
NSArray *myArray;
}
或者您可以在@interface
正文之后和@end
声明之前添加它。
@interface MyClass : NSObject {
//
}
@property (nonatomic, retain) NSArray *myArray;
这两种“风格”之间的区别是什么?你何时选择一种?
2)在@property
之后找到(nonatomic, retain)
等选项。什么是为什么/何时你使用不同的选项?
答案 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方法可用。assign
(默认值),只需指定新值即可。您最有可能只将其用于原始数据类型。retain
,释放旧值并保留新值。如果您使用垃圾收集器,retain
等同于assign
。为什么?手动释放旧值将由垃圾收集器完成。copy
将复制新值并释放旧值。这通常与字符串一起使用。atomic
(默认值)将确保setter方法是原子的。这意味着只有一个线程可以一次访问setter。nonatomic
,当您不使用线程时使用它。 This post为您提供了有关内存管理和assign
,retain
和copy
的详细介绍。
答案 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)
属性基本上是存取方法。它们定义变量的范围。默认情况下,变量的访问权限受保护,属性将其说明符从受保护设置为公共