Ojbective-C为什么不用@public

来源:互联网 发布:淘宝 大麦网 编辑:程序博客网 时间:2024/05/01 14:08
Objective-C中有一个重要的特性——属性,属性用于封装类对象的数据。对于类对象的数据,iOS开发者通常使用“存取方法”来访问。其中,我们通过获取器读取变量值,通过设置器写入变量值。在Objective-C 2.0之后,属性就成为了OC特性的一部分
        在对属性进一步的介绍之前,我们先使用常规面向对象语言的方式来创建一个Person类,包括了firstName和lastName两个字符串变量以及一个私有的riches。通过这种常规类结构来说明属性的重要性,幸运的是OC提供了@public等类成员类型关键词供我们使用,所以我们使用XCode就能完成我们的需求。
        

        Person类的这种声明方式是典型的静态语言的类创建方式。说它是静态语言最重要的原因是因为编译器在编译时就已经确认了类型结构,类成员通过偏移量来访问。下面通过main函数来解释什么是偏移量:
    

        这意味着我们可以用指针p 指向实例对象,然后用p+1, p+2的方式来访问类内部数据。目前用这种方式访问看起来没有任何问题,但是如果我们在firstName前面再添加一个变量age,那么相应的所有地址要往后弄一个指针的长度:
        
        而这种改变意味着编译器在运行程序时需要重新的计算一次类内部所有数据的地址,这导致了每次修改代码之后C++跟Java重新运行的启动速度变慢了。但我们使用OC时却只有第一次编译运行时慢,之后重新启动的速度会非常快,这就要归功于属性这个特性。下面我们使用属性来重写这次代码:
        
        修改完之后这次我们再次在main中访问地址:
        
        报错了,错误的大意为请求属性的地址出错。为什么会发生这种事情?
        原因是因为在用属性@property声明变量时,编译器自动为其生成了getter获取器setter设置器两个方法。为了给大家说明这个,我先给Person的实现文件截个图:
         
        然后我们在main函数中调用:
        
        我们可以发现三个set方法。@property在创建变量后,使用▪方法访问成员变量会自动转换成[p getter]方法,而OC对函数返回值进行了保护,这就解释了我们为什么在修改代码后获取地址失败了。
        我们到现在还是没有解释为什么OC在运行启动时不会因为修改变量而影响速度,这上面讲解的属性似乎也没有任何关系。其实从这两个方法可以看出来,OC的属性变量在创建之后是单独的放在某个内存空间里,使用键值(类似KVC)的方式来进行访问。这种机制导致了我们在添加新的属性变量时,并不会影响原有属性的地址。 当然了,属性机制还可以帮助我们实现“惰性初始化模式”,而OC本身对于属性变量的存储涉及到了包括哈希表在内等多种知识,而这些暂时不是我们所关心的内容。
        总而言之,OC本身支持@public等属性声明,但这种属性声明并不是OC所倡导的。使用属性对于我们在iOS上的开发有着更多的帮助,这也是C++等静态语言使用者转为iOS平台开发所需要适应的地方
另外,祝大家除夕快乐!新的一年新气象,祝各位码农数钱数到手抽筋!

0 0
原创粉丝点击