美文网首页ios基础知识iOS 开发 runtime
iOS-面试官如果问你performSelector用过没?

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

作者: 船长_ | 来源:发表于2016-05-10 22:57 被阅读1555次
    • 面试官如果这样问你,其实想问你有关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方法面前,没有私有方法

    相关文章

      网友评论

      • 1cdb19c230be:你好 用runtime 写 下面还是要写具体方法是吗

      本文标题:iOS-面试官如果问你performSelector用过没?

      本文链接:https://www.haomeiwen.com/subject/hlbyrttx.html