美文网首页
OC中关于成员变量与属性的理解

OC中关于成员变量与属性的理解

作者: 山有木枝壮 | 来源:发表于2019-08-02 09:59 被阅读0次
最近重新接触OC,对于OC中成员变量和属性的理解和使用存在一些问题,理出来记录下

q、成员变量、实例变量、属性

    1. 在类的接口中,在{}内定义的变量称之为成员变量,只能类的内部访问
    1. 实例变量就是{}声明的类变量,比如NSString。实例变量是一种特殊的成员变量
    1. 成员变量在外部不能访问,需要通过声明对应的get和set方法,属性就是自动声明了成员变量的get和set方法
    1. @property name对应的属性会自动为之生成以_开头的成员变量_name,并且自动声明get和set方法
    1. 以前还需要在@implementatiion中使用@synthesize实现成员变量的get和set方法,现在会自动生成
    1. 访问成员变量直接使用(_属性名)如_name就可以了,使用self.name默认访问的是get和set方法
    1. 如果重写了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

相关文章

网友评论

      本文标题:OC中关于成员变量与属性的理解

      本文链接:https://www.haomeiwen.com/subject/wzykdctx.html