为什么说OC是没有绝对的私有方法的

来源:互联网 发布:mac更新卡住 强制重启 编辑:程序博客网 时间:2024/04/29 14:22

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"];

0 0
原创粉丝点击