• iOS成员变量、实例变量、属性变量三者的联系与区别


    一、类Class中的属性property

      在ios第一版中:

      我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如:

      注意:(这个是以前的用法)

    @interface MyViewController :UIViewController
    {
        UIButton *myButton;
    }
    @property (nonatomic, retain) UIButton *myButton;
    @end

      在现在iOS版本中:

      苹果将默认编译器从GCC转换为LLVM(low level virtual machine),从此不再需要为属性声明实例变量了。如果LLVM发现一个没有匹配实例变量的属性,它将自动创建一个以下划线开头的实例变量。因此,在这个版本中,我们不再为输出口声明实例变量。

      ios5更新之后,苹果是建议以以下的方式来使用:

    @interface MyViewController :UIViewController
    @property (nonatomic, retain) UIButton *myButton;
    @end

      因为编译器会自动为你生成以下划线开头的实例变量_myButton,不需要自己手动再去写实例变量。而且也不需要在.m文件中写@synthesize myButton,也会自动为你生成setter,getter方法。

      @synthesize的作用:(1)让编译器为你自动生成setter与getter方法。(2)可以指定与属性对应的实例变量,例如@synthesize myButton = xxx;那么self.myButton其实是操作的实例变量xxx,而不是_myButton了。

      现在:如果.m文件中写了@synthesize myButton,那么生成的实例变量就是myButton;如果没写@synthesize myButton,那么生成的实例变量就是_myButton。所以跟以前的用法还是有点细微的区别。

    二、实例变量与属性变量使用方法

      在MyViewController.m文件中,编译器也会自动的生成一个实例变量_myButton。那么在.m文件中可以直接的使用_myButton实例变量,也可以通过属性self.myButton.都是一样的。用self.yourButton来访问yourButton变量是不对的,Xcode会提示你使用->,改成self->yourButton就可以了。因为OC中点的表达式是表示调用yourButton方法,而上面代码没有yourButton方法,也可以直接使用yourButton。

     三、类别中的属性property

      类与类别中添加的属性要区分开来,因为类别中只能添加方法,不能添加实例变量。经常会在ios的代码中看到在类别中添加属性,这种情况下,是不会自动生成实例变量的。比如在:UINavigationController.h文件中会对UIViewController类进行扩展

    @interface UIViewController (UINavigationControllerItem)
    @property(nonatomic,readonly,retain) UINavigationItem *navigationItem;
    @property(nonatomic) BOOL hidesBottomBarWhenPushed;
    @property(nonatomic,readonly,retain) UINavigationController *navigationController;
    @end

      这里添加的属性,不会自动生成实例变量,这里添加的属性其实是添加的getter与setter方法。

      注意一点,匿名类别(匿名扩展)是可以添加实例变量的,非匿名类别是不能添加实例变量的,只能添加方法,或者属性(其实也是方法)。

    四、成员变量、实例变量、属性变量的联系

    @interface MyViewController :UIViewControlle
    {
    UIButton *yourButton;
    int count;
    id data;
    }
    @property (nonatomic, strong) UIButton *myButton;
    @end

       在{   } 中所声明的变量都为成员变量。 所以yourButton、count、data都是成员变量。既然如此,实例变量又是什么意思呢?

      实例变量本质上就是成员变量,只是实例是针对类而言,实例是指类的声明。{   }中的yourButton就是实例变量。id 是OC特有的类,本质上讲id等同于(void *)。所以id data属于实例变量。

      成员变量用于类内部,无需与外界接触的变量。因为成员变量不会生成set、get方法,所以外界无法与成员变量接触。根据成员变量的私有性,为了方便访问,所以就有了属性变量。属性变量的好处就是允许让其他对象访问到该变量(因为属性创建过程中自动产生了set 和get方法)。当然,你可以设置只读或者可写等,设置方法也可自定义。所以,属性变量是用于与其他对象交互的变量。

      综上所述可知:成员变量是定义在{}号中的变量,如果变量的数据类型是一个类则称这个变量为实例变量。因为实例变量是成员变量的一种特殊情况,所以实例变量也是类内部使用的,无需与外部接触的变量,这个也就是所谓的类私有变量。而属性变量是用于与其他对象交互的变量。

      但是,现在大家似乎都不怎么喜欢用成员变量来定义类的变量,都喜欢用属性变量来定义类的变量。把需要与外部接触的变量定义在.h文件中,只在本类中使用的变量定义在.m文件中。

    PS:此文章是笔者学习iOS以来,对objective-c中变量一点小小理解,若有不合适的地方,还请各位读者指教。

     

  • 相关阅读:
    利用CWinThread实现跨线程父子MFC窗口
    GetForgroundWindow函数的不确定性——BUG笔记
    DLL动态链接库的创建
    php正则讲解 及与 js的正则比较
    cookie和session的讲解
    两种排序的方法 冒泡法 插入法 封装版
    php中获取当前时间
    文件下载及header方法介绍
    文件上传
    二分法封装版
  • 原文地址:https://www.cnblogs.com/FightingLuoYin/p/4341340.html
Copyright © 2020-2023  润新知