iOS開發私有變數和私有方法
阿新 • • 發佈:2019-01-26
oc中有私有變數,沒有私有犯法,但是嚴格來說沒有絕對的私有變數和私有方法
私有變數:
oc中提供了關鍵字@private來宣告私有變數,只允許本類訪問
私有方法:
oc中沒有提供關鍵字來宣告私有方法,可以通過catogry的匿名類Extension通過在一個只在類的.m檔案中來宣告一個只能被本類訪問的方法。
但要注意的一點,OC是一門動態性的語言,他的物件型別和真正要呼叫的方法是在執行時才確定的,所以這就決定了在oc中沒有絕對的私有變數和私有方法的,通過執行時機制runtime我們可以動態的去對類中所有的變數和方法動手腳。
- 訪問私有變數
- 要修改私有變數的值,在你知道這個變數的名字的前提下,可以通過KVC來訪問和改變改私有變數或者
- 可以通過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
- 私有方法:
- 對於私有方法的訪問,我們可以在知道這個方法的名稱以及引數的前提下通過performSelector系列方法訪問,
- 通過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