美文网首页
iOS从重写setter getter方法开始的思考

iOS从重写setter getter方法开始的思考

作者: 一口一个大胖子呀 | 来源:发表于2020-03-15 15:11 被阅读0次

    出于习惯的Coding是很可怕的!

    如何声明一个实例变量

    下面的代码即呼之欲出。

    @property (nonatomic,strong) NSObject *instance;
    

    如何重写instance的getter和setter方法?

    - (NSObject *)instance{
        return _instance;
    }
    
    - (void)setInstance:(NSObject *)instance{
        _instance = instance;
    }
    

    出现下面的报错


    编译器提示错误"未找到标识符_instance"
    我们这里给出导致问题的直接原因是在当我们同时重写getter和setter(存取方法)时,编译器并不会为我们的代码自动生成_instance成员变量,编译器前端自然会在这个时候给我们提示报错。

    让我们从property属性展开了思考

    相信大家或多或少都会在面试中碰到这个问题:在OC中property的本质是什么?

    property = Ivar + setter + getter

    这是我们会直接给出的答案。

    Ivar是什么

    Ivar就是我们实际使用到的实例变量
    我们在其他大部分语言中去声明一个实例变量时,我们需要按以下步骤操作 :)

    1. 声明这个实例变量
    2. 声明该实例变量的修饰关键词(protected,private,public)
    3. 再去声明变量的存取方法

    过于繁琐不是么?
    于是在OC中,提出了property的概念,简化了我们声明实例变量的方式。

    @property (nonatomic,strong) NSObject *instance;
    @synthesize instance = _instance;
    

    甚至于在Xcode4.4之后,出于绝大多数开发者的编程习惯,我们甚至于不再需要声明@synthesize,也就是我们现在需要做的一行搞定一个基本实例变量的声明。

    题外话:Apple这样的操作降低了开发门槛同时也阻挡了大多数人对于事物本质的思考!

    回到最上面的错误提示

    以上的操作让我们在声明变量的同时,自动生成了存取方法起来。
    但是当我们同时去重新声明存取方法声明的某个变量与存取方法之间的关联,自然就不会自动生成_instance变量,关联到存取方法。
    所以我们的解决方案就是@synthesize手动生成变量。

    @synthesize instance = _instance;
    

    bingo!错误提示消除!

    结论

    property(属性)和ivar(实例变量)的关系:
    一般情况下属性的声明包含了对实例变量的声明以及存取方法的关联。同时手动重写存取方法后是例外。

    相关文章

      网友评论

          本文标题:iOS从重写setter getter方法开始的思考

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