OC中有私有变量和私有方法的相关讨论

或者这个问题对于老手来说,来来回回啃了好多次,再拿出来谈,貌似就是鸡肋了(食之无味弃之可惜)。可是对于新手来说,还是有点纠结这个问题到底要怎么去理解,你说它有吧,它明明就各种被调用,说它没有吧,又有@private 什么鬼的修饰,明明就限定为私有的啊 。。。 那好,我们来分清楚思路慢慢谈谈:

先说方法:
首先,OC是一门动态定型(dynamicaly typed)语言,它是动态传递消息机制,所有的方法都是函数调用(有时甚至连系统调用(syscalls)也是如此),在运行时可以允许根据字符串名字来访问方法和类,还可以动态连接和添加类。
本身的机制特点让它并不存在真正意义上的私有。因为在类中创建了该方法之后,在别的类中只要import这个类,实际上就会导入h文件和m文件,所以你不论是写在h文件还是m文件,都是可以强制调用到的。
只是你把方法写在m文件中不在h文件声明,这样的情况在arc环境中,编译器会爆黄提醒你,但是还是会编译通过。
因为OC在编译阶段可以调用任何函数,甚至是这个函数并未实现,(在真正运行的时候才会通过函数的名去对应的函数来调用它),更何况你这个方法在别的类中已经实现过了。
只是写在m文件中,它并不提醒你有这个方法(想调用它的前提是你知道这个隐藏的方法名和参数,然后通过 performSelector 系列方法或者用 NSInvocation 调用,或者用 objc_msgSend 函数(传递消息机制)或者直接拿到方法对应的 IMP类似函数指针,然后像 C 函数那样直接调用)。

再说变量:
@private 定义私有变量,一般来说,设置这样的变量就是私有变量了,可是也不纯粹,因为私有变量只有声明此变量的类本身才能调用。
但是呢,学过OC语法的都知道KVC(key-value-coding),它提供一种机制来间接访问对象的属性,它的存在就打破了类的封装性,强制性访问类的属性。
(不过前提还是得知道你这个属性名),像上面的,如果你把属性写到m文件的Class Extension也和私有变量一样只能通过kvc的方式去修改。

总结一下:
不论是方法还是属性,就算它是私有的,如果你想强制性的去调用的话,死抠方法还是能给你修改到属性或者调用到方法的。不过,从理论层面上来讲,方法不存在私有,而变量存在私有。
还有一种普遍的说法是:OC里面只有类方法和实例方法两种,所有的实例变量默认都是私有的,所有实例方法默认都是共有的。

原文地址:

http://blog.csdn.net/csdn_hhg/article/details/50060089

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,420评论 30 472
  • 1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch...
    阳光的大男孩儿阅读 10,492评论 0 13
  • 1.OC里用到集合类是什么? 基本类型为:NSArray,NSSet以及NSDictionary 可变类型为:NS...
    轻皱眉头浅忧思阅读 5,244评论 0 3
  • 2、#import和#include的区别是什么?#import<> 跟 #import""有什么区别? .#im...
    AlanGe阅读 2,720评论 0 0
  • 第1步:下载Python3.5 下载地址如下: Python3.5 这里面有windows和mac os x下的安...
    欺尘阅读 4,470评论 0 1

友情链接更多精彩内容