第6条 理解“属性”这一概念

@interface EOCPerson: NSObject

@property NSString *firstName;

@property NSString *lastName;

@end

需要说明的是,除了编译器能够生成set/get的方法外,编译器还要自动向类中添加适当类型的实例变量,并且在属性名前面加下划线,以此作为实例变量的名字。在前例中,会自动生成两个实例变量,其名称分别为_firstName与_lastName。

也可以在类的实例代码里通过@synthesize语法来指定实例变量的名字

@implementation EOCPerson

@synthesize firstName = _myFirstName;

@synthesize lastName = _myLastName;

@end

前述语法会将生成的实例变量命名为_myFirstName与_myLastName,而不再使用默认的名字。

若不想令编译器自动合成存取方法,则可以自己实现。还有一种方法能阻止编译器自动合成存取方法,就是使用@dynamic关键字。它会告诉编译器:不要自动创建实现属性所用的实例变量,也不要为其创建存取方法。

内存管理语义:

属性用于封装数据,而数据则要有“数据所有权语义”,下面这一组特质仅会影响设置方法。例如用设置方法设置新值时,它是应该“保留”此值呢,还是将其赋值给底层实例变量呢。

strong 此特质表明该属性定义了一种拥有关系,为这种属性设置新值时,设置方法会保存新值,释放旧值,然后将新值设置上去。

weak 此特质表明该属性定义了一种非拥有关系,为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。同assign类似,然而属性所指得对象遭到摧毁时,属性值也会清空

unsafe_unretained 此特质的语义和assign相同,但它适用于对象类型(object type),该特质表达一种“非拥有关系”,当目标对象遭到摧毁时,属性值不会清空

copy 此特质表达的所属关系和strong 类似。设置方法不保留新值,而是将其拷贝。当所属类型是NSString *时,经常用此特质来保护期封装性。

你可能感兴趣的:(第6条 理解“属性”这一概念)