1. 程式人生 > >iOS開發私有變數和私有方法

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 set
Value:@"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<count; 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