iOS笔记--oc语法6 (OC中有私有变量和私有方法的相关讨论)

来源:互联网 发布:iphone蜂窝数据快捷键 编辑:程序博客网 时间:2024/05/22 06:55

申明:此为本人学习笔记,若有纰漏错误之处的可留言共同探讨


或者这个问题对于老手来说,来来回回啃了好多次,再拿出来谈,貌似就是鸡肋了(食之无味弃之可惜)。可是对于新手来说,还是有点纠结这个问题到底要怎么去理解,你说它有吧,它明明就各种被调用,说它没有吧,又有@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里面只有类方法和实例方法两种,所有的实例变量默认都是私有的,所有实例方法默认都是共有的。

0 0
原创粉丝点击