关于Objective C的私有函数
(1)很多从其他语言(例如C++)转到objective c的初学者,往往会问到一个问题,如何定义类的私有函数?这里的“私有函数”指的是,某个函数只能在类的内部使用,不能在类的外部,或者派生类内部使用。事实上,Objective C中可以定义类的私有变量,但由于objective c是动态语言,因此本质上是不存在私有函数的。但是,也可以用一些机制,来实现类似其他语言中私有函数的效果。
(2)一般来说,可以使用两种方式来实现。
第一种:只在.m文件中实现该函数,不在.h文件中声明,这样是最简单的方式。
.h文件
@interfaceMyClass
{
// My Instance Variables
}
- (void)myPublicMethod;
@end .m 文件:
@implementationMyClass
- (void)myPublicMethod
{
// Implementation goes here
}
- (void)myPrivateMethod
{
// Implementation goes here
}
@end
上面的myPrivateMethod函数只在m文件中实现了,没有在h文件中声明,那么外部就不能使用:[obj myPrivateMethod]的方式调用,在派生类中也不能使用[super myPrivateMethod] 或者[self myPrivateMethod]的方式来调用。
第二种:在m文件中加上一个oc extension,在里面声明需要的私有函数。
.h 文件:
@interfaceMyClass
{
// My Instance Variables
}
- (void)myPublicMethod;
@end .m 文件:
@interfaceMyClass()
- (void)myPrivateMethod;
@end @implementationMyClass
- (void)myPublicMethod
{
// Implementation goes here
}
- (void)myPrivateMethod
{
// Implementation goes here
}
@end
以上两种方式,功能完全一样,区别仅仅在于,团队开发时,后面一种的代码可读性更好,所以一般还是推荐后面一种方式。
(3)前面已经提到,对于Objective C来说,真正意义上的私有函数是不存在的。因为即使用上述的方法,不在头文件中声明函数,外部也可以使用objc_msgSend或者performSelector来调用这个函数。 比如上面的myPrivateMethod,在类的外部可以直接使用[obj performSelector:@selector(myPrivateMethod)]… 来调用。有人说performSelector只能传一个参数,那么使用objc_msgSend(obj, @selector, …),就可以传N个参数了。所以说,用上面的机制,可以实现类似其他语言中“私有函数”的效果,但并不能完全保证这个函数是私有的。
备注:在下面附上的帖子里有人提到,可以用一个外部的block来实现私有函数,但是这其实意义不大,因为在外部的block里面是不能访问类的self的,已经不算是成员函数了。
参考:http://stackoverflow.com/questions/647079/is-it-possible-to-declare-a-method-as-private-in-objective-c
http://stackoverflow.com/questions/172598/best-way-to-define-private-methods-for-a-class-in-objective-c/651852#651852
关于Objective C的私有函数的更多相关文章
- js通过继承实现私有函数
本文是原创文章,如需转载,请注明文章出处 主要思想就是在继承时,只开放共有的属性和方法,不开放另外某些函数,从而实现私有的作用. function A(){ this.x = 100; this.y ...
- lua实现私有函数
本文是原创文章,如需转载,请注明文章出处 要用lua实现私有函数,关键就是使用metatable的特性来实现. Test.lua: local v = {};v.x = 100;v.y = 200; ...
- Python私有函数和公开函数
类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等: # private私有函数 def _private_1(name): retu ...
- 转:C++:从子类访问父类的私有函数
众所周知,c和c++的数组都是不安全的,因为无论c还是c++都不提供数组边界检查功能,这使得数组溢出成为可能.从某个意义上说,c和c++是一种缺少监督的语言,然而这也正是其魅力所在.c++给予程序员更 ...
- python中得公有和私有——私有函数和公开函数_补充完整
包括实例属性.类属性,私有成员和公有成员,公有方法.私有方法和静态方法. 类似_xxx和__xxx这样的函数或变量就是非公开的,不应该被直接引用.如下: # python私有函数 def _abc_1 ...
- JS进阶-特殊形式的函数-内部私有函数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Matlab匿名函数,子函数,私有函数,重载函数,eval和feval函数
匿名函数,子函数,私有函数等函数类型 匿名函数: 匿名函数没有函数名,也不是.m文件,只包含一个表达式和输入输出参数. Fxy=@(x,y)x.^y+3*x*y x,y为输入输入参数,Fxy为函数名 ...
- c++排序二叉树的出现的私有函数讨论,以及二叉树的删除操作详解
c++排序二叉树的出现的私有函数讨论, 以及二叉树的删除操作详解 标签(空格分隔): c++ 前言 我在c++学习的过程中, 最近打了一个排序二叉树的题目,题目中出现了私有函数成员,当时没有理解清楚这 ...
- Windows PE导出表编程4(重构导出表实现私有函数导出)
本次是尝试调用DLL里面的私有函数. 一: 之前先探索一下,首先可以考虑用偏移量来调用,就是如果知道了某个私有函数和某个导出的公共函数的相对便宜的话,直接加载dll获取公共函数地址,然后自己手动去偏移 ...
随机推荐
- 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_11-SpringSecurityOauth2研究-JWT研究-JWT介绍
3.6 JWT研究 3.6.1 JWT介绍 在介绍JWT之前先看一下传统校验令牌的方法,如下图: 问题: 传统授权方法的问题是用户每次请求资源服务,资源服务都需要携带令牌访问认证服务去校验令牌的合法性 ...
- jQuery BlockUI Plugin Demo 4(Element Blocking Examples)
Element Blocking Examples This page demonstrates how to block selected elements on the page rather t ...
- [CareerCup] 2. Bomberman 炸弹人
We have a 2D grid. Each cell is either a wall, an enemy or empty. For example (0-empty, X-enemy, Y-w ...
- django model的update时auto_now不被更新的原因
gmt_create自动添加auto_now_add:gmt_modify自动更新auto_now class CommonInfo(models.Model): """ ...
- 从源码角度解析Netty的React模式是如何工作的
Netty 支持多种实现方式,比如nio,epoll 等,本文以nio的实现方式进行讲解. 1.EventLoop : 事件循环看,简单来说就是一个死循环监听事件,如果事件来了,处理掉.通常做法就是开 ...
- Jenkins简单入门:下载-安装-配置-构建
Jenkins简单配置流程 官网下载地址:https://jenkins.io/index.html 1.下载安装Jenkins (1)点击Download Jenkins进入下载页 (2)根据自己运 ...
- word模板文档填充数据
1.切记一定要用Word 97-2003(*.doc)格式的文档另存为 *.xml格式的文件,而不能用 Word 2007(*.docx)格式的word文档转 *.xml,将转成功之后的xml文件放入 ...
- Memcached的安装与常用命令
一.概述 MSM:Memcached-Session-ManagerMemcached是一款高性能.分布式的内存对象缓存系统 二.安装Memcached 在安装Memcached之前,我们需要先安装上 ...
- nginx+keepalived主从高可用配置
上面有4台web服务器 我们实验条件限制,就开两台web服务器1.117 1.119 一.环境准备: 系统环境:CentOS 6.5 x86_64 Nginx版本:nginx v1.6.2 Kee ...
- 怎么通过外网来访问自己在Tomcat服务器中配置的项目
目前还没有试验过 https://blog.csdn.net/qingyisuo/article/details/80086105