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方法面前,没有私有方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的...
    西木阅读 30,810评论 33 466
  • 之前去XXXX公司面试被问到“怎样使用performSelector传入3个以上参数,其中一个为结构体?”当时年少...
    Miu七七阅读 12,370评论 2 16
  • 目录 Objective-C Runtime到底是什么 Objective-C的元素认知 Runtime详解 应用...
    Ryan___阅读 5,941评论 1 3
  • 从十几岁开始,写日记的习惯保持至今,不知不觉间,突然意识到已经二十多年。日记就像是记录着我人生的录影带,带着从少年...
    模模的世界阅读 2,642评论 2 2
  • 小结 第16天,边框。边框都很小巧可爱,但我尤其喜欢草绿色的边框。许是草绿色夺目,有一股稚嫩的生机,许是那叶子(心...
    沐容雅阅读 1,189评论 1 1

友情链接更多精彩内容