iOS-面试官如果问你performSelector用过没?

  • 面试官如果这样问你,其实想问你有关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方法面前,没有私有方法

你可能感兴趣的:(iOS-面试官如果问你performSelector用过没?)