- 面试官如果这样问你,其实想问你有关runtime一些基础知识
- Objective-C中调用函数的方法是“消息传递”,这个和普通的函数调用的区别是,你可以随时对一个对象传递任何消息,而不需要在编译的时候声明这些方法。所以Objective-C可以在runtime的时候传递人和消息
- Cocoa提供NSClassFromString和NSSelectorFromString,利用OC动态特性是通过String来生成Classes和Selectors
- NSSelectorFromString动态加载实例方法
主要学习一下NSSelectorFromString
示例1
通过传一个字符串参数,生成一个方法,并返回一个数组
tmpArray1 = [self getArrayWithType:@"SarlaryRange"];
tmpArray2 = [self getArrayWithType:@"WorkAge"];
- (NSMutableArray *)getArrayWithType:(NSString *)type {
NSString *action = [NSString stringWithFormat:@"update%@Action", type];
NSArray *tmpArray = [[NSArray alloc] init];
SEL sel = NSSelectorFromString(action);
if ([self respondsToSelector:sel]) {
tmpArray = [self performSelector:sel];
}
return array;
}
- (NSArray *)updateSarlaryRangeAction {
NSArray *array = @[@"不限",@"3k~5K",@"5k~10k",@"10k~20k",@"20k~30k"];
return array;
}
- (NSArray *)updateWorkAgeAction {
NSArray *array = @[ @"不限", @"1年以下", @"1~3年", @"3~5年", @"5~10年" ];
return array;
}
示例2
应用需求:遍历数组,让数组中每个对象执行对应的方法
1.普通写法
for (id data in object) {
if ([[data type] isEqualToString:@"String"]) {
[self parseString:[data value]];
} else if ([[data type] isEqualToString:@"Number"]) {
[self parseNumber:[data value]];
} else if ([[data type] isEqualToString:@"Array"]) {
[self parseArray:[data value]];
}
}
2.利用NSSelectorFromString
生成方法名,利用performSelector
执行方法
- (void)parseObjectDynamic:(id)object {
for (id data in object) {
[self performSelector:NSSelectorFromString([NSString stringWithFormat:@"parse%@:", [data type]]) withObject:[data value]];
}
}
- (void)parseString:(NSString *)aString {}
- (void)parseNumber:(NSString *)aNumber {}
- (void)parseArray:(NSString *)aArray {}
示例3
带有两个参数的写法
// 有参数
SEL sel = NSSelectorFromString(@"test::");
if([self respondsToSelector:sel]){
// withObject:参数;
[self performSelector:sel withObject: @"test1" withObject: @"test2" ];
}
}
- (void)test:(NSString *)str1 :(NSString *)str2{
NSLog(@"%@--%@",str1,str2);
}
在performSelector
方法面前,没有私有方法