年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1939|回复: 0

@property的作用

[复制链接]
  • TA的每日心情
    奋斗
    2022-12-13 21:26
  • 签到天数: 371 天

    [LV.9]以坛为家II

    发表于 2014-3-17 11:32:33 | 显示全部楼层 |阅读模式
    本帖最后由 Sian 于 2014-3-17 14:59 编辑

    三步曲:
    1、只能写在类声明文件(.h文件)中,并且会自动声明成员变量的setter和getter方法;
    2、如果在类实现文件中没有实现成员变量的setter和getter方法,将替代@synthesize的功能,实现这两个方法;
    3、在实现setter和getter方法时如果发现没有相关成员变量,同时会自动生成相应的成员变量;

    注意:
    三步曲当中是有先后顺序的
    1、如果已经有了setter方法或getter方法的声明则@property不会生成相应的方法声明;
    2、如果已经有了setter方法或getter方法的实现,则不会替代@synthesize去生成相应的方法实现;
    3、如果有相关成员变量则不生成相应的成员变量;
    4、如果setter方法和getter都有实现并且没用到任何成员变量(空实现),同样不会生成相应的成员变量,在debug中可以看到成员变量为空。

    示例:
    @property int age;
    这一句代码编译器展开后为:
    1、生成相应的setter方法和getter方法声明
    - (void)setAge:(int)age;
    - (int)age;
    2、生成相应的setter方法和getter方法实现(如果没有实现的话)
    @synthesize age = _age;
    编译器展开后为:
    - (void)setAge:(int)age
    {
         age = _age;
    }
    - (int)age
    {
        return _age;
    }
    3、在setter和getter方法实现时需要用到成员变量_age,如果没有声明成员变量_age此时会自动生成_age;

    PS:为什么说有先后顺序呢,如果setter方法和getter方法都自己实现,则没有替代@synthesize生成getter和setter方法这一步骤,也就不存在需要使用成员变量_age这一步骤,从而也就不关心是否有成员变量_age,所以原本有就有,没有就没有,编译器不关心成员变量_age的存在性;如果编译器需要使用而又不存在该成员变量时,自动生成;

    值得一提的是,编译器自动生成的成员变量,属性都为private
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Archiver|iOS开发笔记 ( 湘ICP备14010846号 )

    GMT+8, 2024-5-5 20:09 , Processed in 0.049133 second(s), 23 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表