在Java/C#等面向对象语言中,方法的访问权限可以通过public/private/protected来控制其访问权限。而在OC中,方法却并没有访问修饰符。OC中是没有绝对的私有方法的。
OC是一门非常动态化的语言,即使是我们写了一个私有变量,照样可以通过KVC来强制修改,依旧称不上是安全的。那么将属性直接写入类扩展中,不失为一种安全的做法,这就是class extension存在的意义。写入类扩展后,使用KVC访问不到属性存在,但是可以访问到方法。
由于Objective-C的动态消息传递机制,OC中不存在真正意义上的私有方法。私有方法只是没有公开文档,同样可以使用运行时特性来调用。
因为:在编译时,即使这个方法不在头文件中声明,编译器仍然会将方法的签名编译进类的方法列表中,发送消息时,会自动查找消息列表,如果找到同名消息,则会被触发.
调用私有方法:
SEL selector = NSSelectorFromString(@"privateMethod");
Object *ob = [[Objectalloc]init];
IMP imp = [obmethodForSelector:selector];
typedefvoid (*func_t)(id,SEL);
func_t func = (func_t)imp;
func(ob,selector);
// 私有方法:
- (void)privateMethod {
NSLog(@"private");
}
访问并修改私有变量:
[object setValue:@"value"forKey:@"key"];