一.前言
由于最近十分空閑, 來(lái)寫一修改私有屬性的文章
1.什么是私有屬性?
答: 就是寫在.m延展里的屬性, 這個(gè)屬性在其他類中用點(diǎn)方法訪問(wèn)不到的.
二.如何修改呢
目前有兩種方法
1.KVC
比如有個(gè)person類, 在.m中的延展里有個(gè)屬性是name, 那么怎么訪問(wèn)呢
@interface Person ()
@property(nonatomic, strong) NSString *name;
@end
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
Person *person = [[Person alloc] init];
NSLog(@"修改前:%@", [person valueForKey:@"name"]);
[person setValue:@"李四" forKey:@"name"];
NSLog(@"修改后:%@", [person valueForKey:@"name"]);
}
打印結(jié)果如下:
修改前:(null)
修改后:李四
2.runtime
使用runtime修改私有屬性也非常簡(jiǎn)單, 基本上無(wú)腦.
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
Person *person = [[Person alloc] init];
//修改前打印
NSLog(@"修改前:%@", [person valueForKey:@"name"]);
//記錄屬性的個(gè)數(shù)
unsigned int count = 0;
//獲取屬性列表
Ivar *members = class_copyIvarList([person class], &count);
//遍歷屬性列表
for (NSInteger i = 0; i < count; i++) {
//取到屬性
Ivar ivar = members[i];
//獲取屬性名
const char *memberName = ivar_getName(ivar);
NSString *ivarName = [NSString stringWithFormat:@"%s", memberName];
NSLog(@"屬性名:%@", ivarName);
//當(dāng)屬性名是_name的時(shí)候?qū)ζ渲颠M(jìn)行修改
if ([ivarName isEqualToString:@"_name"]) {
object_setIvar(person, ivar, @"李四");
}
}
//修改后打印
NSLog(@"修改后:%@", [person valueForKey:@"name"]);
}
打印結(jié)果如下:
修改前:(null)
_name
修改后:李四