iOS笔记--oc语法6 (OC中有私有变量和私有方法的相关讨论)
2015-11-26 19:37
267 查看
申明:此为本人学习笔记,若有纰漏错误之处的可留言共同探讨
或者这个问题对于老手来说,来来回回啃了好多次,再拿出来谈,貌似就是鸡肋了(食之无味弃之可惜)。可是对于新手来说,还是有点纠结这个问题到底要怎么去理解,你说它有吧,它明明就各种被调用,说它没有吧,又有@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的方式去修改。
总结一下:
不论是方法还是属性,就算它是私有的,如果你想强制性的去调用的话,死抠方法还是能给你修改到属性或者调用到方法的。不过,从理论层面上来讲,方法不存在私有,而变量存在私有
或者这个问题对于老手来说,来来回回啃了好多次,再拿出来谈,貌似就是鸡肋了(食之无味弃之可惜)。可是对于新手来说,还是有点纠结这个问题到底要怎么去理解,你说它有吧,它明明就各种被调用,说它没有吧,又有@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的方式去修改。
总结一下:
不论是方法还是属性,就算它是私有的,如果你想强制性的去调用的话,死抠方法还是能给你修改到属性或者调用到方法的。不过,从理论层面上来讲,方法不存在私有,而变量存在私有
相关文章推荐
- ios数据缓存
- IOS开发判断在字符串中是否包含相应的字符
- 根据不同的系统走不同的流程 iOS 发布时隐藏NSLog
- 二维码的扫描--iOS
- iOS开发中的正则表达式(转)
- 获取BIOS常规内存容量
- iOS 视图被覆盖时怎么接受事件处理
- iOS笔记--oc语法5 (static全局变量与全局变量)
- ios 7 模糊效果
- IOS开发之----Xcode非ARC项目中设置部分文件ARC支持
- iOS开发- 蓝牙后台接收数据(BLE4.0)
- Gitolite安装使用
- [IOS开发教程] ios开发培训:浅析最方便的iOS开发环境
- 告诉你 IOS9.0 之后的Bitcode到底是什么!!
- 如何用IOS调用WebService(SOAP接口)
- IOS图层Layer学习笔记(四)—— CAShapeLayer
- 苹果ios开发者证书申请及应用上线发布 真机调试
- iOS代理,协议
- iOS 使用tableView实现 个人中心列表
- iOS 设计模式