美文网首页iOS专家之路
iOS 成员变量和属性

iOS 成员变量和属性

作者: YANGXIXIYear | 来源:发表于2019-04-03 12:06 被阅读0次

    平时开发过程中,一直在使用成员变量和属性,那其区别是什么呢?实例变量又是什么呢?

    一、基本概念

    @interface ViewController ()
    {
        NSString *name;
    }
    
    @property (nonatomic, strong) NSString *birthday;
    
    @end
    

    如上图所示:
    1、{ }中定义的变量为成员变量,name则为成员变量
    2、@property声明属性,birthday为属性

    二、发展历史

    @interface ViewController ()
    {
        // 1. 声明成员变量
        NSString *name;
    }
    // 2. @property 声明实例变量
    @property (nonatomic, copy) NSString *name;
    
    @end
    
    @implementation ViewController
    // 3. @synthesize生成set方法
    @synthesize name;
    

    ** 上述写法为iOS5以前的写法,因为当时的编译器为GCC,所以属性的正常写法需要成员变量 + @property + @synthesize

    ** 缺少@synthesize,编译器会报警告,因为该步骤是生成setter/getter方法

    ** 该方法不会自动生成以下划线开头的实例变量_name

    ** 通过@synthesize name = xxx;指定与属性对应的实例变量为xxx,操作self.name时则是操作实例变量xxx,而非_name

    ** iOS5以后,编译器转换为LLVM后,@property声明的属性会默认生成_类型的成员变量,也会生成setter/getter 方法

    三、成员变量

    @interface ViewController ()
    {
        NSString *name;
    }
    

    上述代码声明了一个成员变量,没有setter/getter方法,所以不能用self.name的形式来访问,可以直接用name,也可以用self->name

    self->name = @"你好";
    NSLog(@"%@", name);
    

    为什么不能用点语法访问???因为OC中点语法是调用对象的setter或getter方法,而成员变量没有该两种方法,所以不能用点语法访问。

    四、属性

    成员变量只用于类的内部,外界无法访问,那什么变量可以被外界访问呢?那就是属性变量

    @interface ViewController ()
    
    @property (nonatomic, strong) NSString *name;
    
    @end
    

    1、属性在创建过程中自动生成了setter和getter方法,可允许其他对象访问,可以用点语法访问;
    2、@property声明的属性会默认生成_类型的成员变量,在本类中可以用下划线访问该属性对象;
    3、可以重写其getter和setter方法。

    五、实例变量

    @interface ViewController ()
    {
        NSString *birthday;
        int age;
    }
    
    @end
    

    上面讲发展历史时,提到实例变量这个概念,什么是实例变量呢?
    1、实例(instance)即为类的表现,实例变量的本质是成员变量,实例变量是成员变量的一种特殊情况;
    2、成员变量 = 实例变量 + 基本数据类型变量,birthday和age均为成员变量,birthday为实例变量,age为基本数据类型变量;

    总结:

    1、成员变量是不与外界接触的变量,应用于类的内部,所以当用于类内部,属性为private时,就可以将变量定义为成员变量;
    2、属性变量可以让其他对象访问,可以设置只读、只写等属性,当属性为public时,定义属性在.h中;
    3、当类的内部需要用getter/setter方法实现一些功能时,需要定义属性在.m中。

    参考地址:
    成员变量和属性区别(@property那点事儿)

    相关文章

      网友评论

        本文标题:iOS 成员变量和属性

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