iOS开发私有变量和私有方法

oc中有私有变量,没有私有犯法,但是严格来说没有绝对的私有变量和私有方法

私有变量:

oc中提供了关键字@private来声明私有变量,只允许本类访问

私有方法:

oc中没有提供关键字来声明私有方法,可以通过catogry的匿名类Extension通过在一个只在类的.m文件中来声明一个只能被本类访问的方法。


但要注意的一点,OC是一门动态性的语言,他的对象类型和真正要调用的方法是在运行时才确定的,所以这就决定了在oc中没有绝对的私有变量和私有方法的,通过运行时机制runtime我们可以动态的去对类中所有的变量和方法动手脚。

  • 访问私有变量
    1. 要修改私有变量的值,在你知道这个变量的名字的前提下,可以通过KVC来访问和改变改私有变量或者
    2. 可以通过runtime获取所有的成员变量列表,然后修改你想要修改的
      看下面一个例子
Person.m
#import "Person.h"
@interface Person()
{
    @private
    NSString *name;
    @public
    NSString *age;
}
-(void)testPrivate;
@end
@implementation Person
-(void)testPrivate{
    NSLog(@"我是只有perSon类可见的");
}
@end

1:通过kvc来访问和修改私有变量

Person *p = [[Person alloc]init];
[p setValue:@"hello" forKeyPath:@"name"];
NSLog(@"%@",[p valueForKey:@"name"]);

2:可以通过runtime
先获取类的所有属性列表

  unsigned int count;
    Ivar *ivars = class_copyIvarList([fatheController class], &count);
    for (int i = 0; i<count; i++) {
        Ivar ivar = ivars[i];
        char *str = ivar_getName(ivar);
        NSLog(@"%s",str);
    }
//结果如下
2017-01-26 16:36:33.427 test[3717:177197] name
2017-01-26 16:36:33.427 test[3717:177197] age

修改指定的属性

    Ivar name = ivars[0];
    object_setIvar(fv, name, @"Jenny");
    NSLog(@"%@",object_getIvar(fv, name));
//结果如下
2017-01-26 16:43:49.836 test[3807:180857] Jenny
  • 私有方法:
    1. 对于私有方法的访问,我们可以在知道这个方法的名称以及参数的前提下通过performSelector系列方法访问,
    2. 通过runtime获取方法列表,然后调用。

1:通过performSelector系列方法

 Person *p = [[Person alloc]init];
 [p performSelector:@selector(testPrivate) withObject:nil];会报警告
 //结果如下
 2017-01-26 17:01:25.051 test[4026:190556] 我是只有perSon类可见的

2:通过runtime运行时访问
先获取所有的方法列表,调用要调用的方法

    Method *methods = class_copyMethodList([Person class], &count);
    for (int i = 0; i{
        Method method = methods[i];
        SEL methodName = method_getName(method);
        NSString *name = [NSString stringWithCString:methodName encoding:NSUTF8StringEncoding];
        NSLog(@"%@",name);

    }
//结果如下
2017-01-26 17:01:25.053 test[4026:190556] testPrivate
2017-01-26 17:01:25.053 test[4026:190556] .cxx_destruct

你可能感兴趣的:(iOS开发私有变量和私有方法)