美文网首页
成员变量、实例变量、属性之间的关系

成员变量、实例变量、属性之间的关系

作者: 不会打滚儿的狮子 | 来源:发表于2016-07-20 01:20 被阅读88次

    成员变量、实例变量、属性之间的关系

    首先来区别一下 实例变量、成员变量的区别:

    【iOS开发日记-2014.6.20】成员变量、实例变量、属性之间的关系

    可以看到在接口 @interface 括号里面的统称为”成员变量”,实例变量是成员变量中的一种!

    实例变量的英文翻译是 Instance Variable (object-specific

    storage)

    实例的英文翻译为Instance(manifestation

    of a

    class)

    说的是“类的表现”,说明实例变量应该是由类定义的变量!

    除去基本数据类型int float ....等,其他类型的变量都叫做实例变量。

    **实例变量+基本数据类型变量=成员变量**

    接下来说说 属性:

    在@property(描述1 , 描述2 , 描述3)(class *) varName 里面,有3个描述词需要填写(也可以不填写取默认值)

    1. nonatomic<-->atomic

    2. readwrite<-->readonly

    3. retain/copy/assign

    首先来介绍一下:

    retain :他指的是将某个内存区域的指针赋值给变量,同时把该内存区域的引用计数器加1.每执行一次,该内存区域的引用计数器就要加1,当该区域的引用计数器变为0的时候内存区域被释放!

    copy :它指的是将目标内存区域的值复制一份,然后开辟新的内存区域(新的指针)粘贴这个值。同时变量被赋值为新内存区域的指针!

    assign:它指的是,仅只把目标内存区域的指针赋值给变量,该内存区域的引用计数器不发生变化!

    1、2两点不做解释,3中的retain、copy、assign都是指的,在自动生成setter函数的时候,编译器需要识别个描述词来生成对应的setter函数!需要注意的是,如果没有加上该类的描述词,系统默认该变量的setter方法采取assign的方式。

    在头文件中.h一般在{}里面会有定义的实例变量

    示例:

    .h

    @property (automic,retain) NSString * abc;

    .m

    @sythesize abc;

    //在写了@sythesize abc;的情况下,系统不会自动生成实例变量“_abc”,直接通过变量名abc ,也就是直接使用变量名在赋值运算的时候(=号左边),只是将内存区域的指针赋值给变量,相当于assgin. 如果是通过“点语句”self.abc= 来赋值,就要看在@property中定义的是copy、retain、assign哪一种了,如果没有加上上述描述词,就默认为assign。

    //如果没有写@sythesize abc; 系统会默认自动在.h文件{}中添加一个 不可见的 加“_”的成员变量(即使是变量名中本身就带有“_”)

    //括号里面定义的都是成员变量(基本数据类型+类生成变量),里面的变量可以在.m文件中通过“变量名称”、self->“变量名称”直接访问到括号里面的变量,但是,这样的赋值访问只能是assign,原对象的引用计数器不会发生变化。

    //1.@sythesize 变量名;2.@sythesize 变量名=_变量名;3.不写@sythesize (一下提到的变量名都是指的在头文件中@property 中定义的变量)

    1.成员变量,实例变量通过“变量名”或者self->“变量名”直接访问到,赋值(assign)。self.变量名 实现setter,getter方法。

    2.成员变量,实例变量通过“_变量名”或者self->“_变量名”直接访问到,赋值(assign)。self.变量名 实现setter,getter方法。

    3.成员变量。实例变量(系统自动在原来变量名前加上“_”来生成的实例,成员变量),直接通过self->_变量名,或者变量名直接访问到(assign)。self.变量名 实现setter,getter方法。

    如果在头文件中没有通过@property定义的变量,但是在{}中有定义成员变量,在实现文件中也也没有@sythesize ,那么可以直接通过self->“{}中的变量名”,或者直接使用“{}中的变量名”来访问赋值,这样的变量没有定义setter,getter函数,只能是assign的方式赋值。

    //再来分析一下@sythesize中的写法,@sythesize abc 直接在.m文件中使用self.abc可以调用成员变量的setter、getter函数,直接调用成员变量名称abc就为访问该变量的指针,对成员变量直接赋值等同于ASSIGN效果。

    相关文章

      网友评论

          本文标题:成员变量、实例变量、属性之间的关系

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