iOS-面試官如果問你performSelector用過沒?

weixin_33912445發表於2016-05-10
  • 面試官如果這樣問你,其實想問你有關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方法面前,沒有私有方法

相關文章