最近重新接触OC,对于OC中成员变量和属性的理解和使用存在一些问题,理出来记录下
q、成员变量、实例变量、属性
- 在类的接口中,在{}内定义的变量称之为成员变量,只能类的内部访问
- 实例变量就是{}声明的类变量,比如NSString。实例变量是一种特殊的成员变量
- 成员变量在外部不能访问,需要通过声明对应的get和set方法,属性就是自动声明了成员变量的get和set方法
- @property name对应的属性会自动为之生成以_开头的成员变量_name,并且自动声明get和set方法
- 以前还需要在@implementatiion中使用@synthesize实现成员变量的get和set方法,现在会自动生成
- 访问成员变量直接使用(_属性名)如_name就可以了,使用self.name默认访问的是get和set方法
- 如果重写了get和set方法,那么不会再生成_name的成员变量,可以使用@synthesize指定成员变量名称或者在@interface中定义成员变量
对照下面的例子就能够清晰的理解
接口文件
@interface Person : NSObject
{
NSInteger age; // 成员变量
NSString *name; // 实例变量,(是一个类的对象,自定义类也是)
NSString *_detail; // 重写属性detail的getter和setter不会自动生成_detail实例变量,需要手动添加
}
// age属性,会自动生成_age的成员变量和getter、setter方法
@property (nonatomic, assign) int height;
// detail属性,如果重写getter和setter方法,不会再自动生成_detail实例
@property (nonatomic, strong) NSString *detail;
@end
实现文件
@implementation Person
- (NSString *)detail {
return _detail;
}
- (void)setDetail:(NSString *)detail {
// 不能使用self.detail = detail。在oc中=左边的点代表设置方法,会循环调用自己
// 使用属性自动生成的变量,可以使用self->_detail,或者self->_height
_detail = detail;
// self.detail = detail; // 错误写法
}
@end