动态创建类 并且调用类方法

解耦合是一个老生常谈的话题,oc是一门动态语言,所以如何再.m文件中不导入其他.h文件 就可以调用一个类的方法,是非常诱人的一件事

1.通过performseletor来动态调用方法

    Class clzz = NSClassFromString(@"Person");
    id instance = [[clzz alloc]init];
    SEL seletor = NSSelectorFromString(@"run:");
    [instance performSelector:seletor withObject:nil];

但是这样xcode会有一个警告,具体原因大家可以去谷歌搜一把,
2.优化版本

    Class clzz = NSClassFromString(@"Person");
    id instance = [[clzz alloc]init];
    SEL seletor = NSSelectorFromString(@"run:");
    NSDictionary * dic = @{@"key":@"ss",@"key1":@"ss"};
    IMP imp = [instance methodForSelector:seletor];
    void (*func)(id, SEL,NSDictionary *) = (void *)imp;
    func(instance, seletor,dic);

3.一种比较浪费时间 的方法 NSInvocation

    Class clzz = NSClassFromString(@"Person");
    id instance = [[clzz alloc]init];
    NSMethodSignature *signture = [instance methodSignatureForSelector:@selector(run:)];
    NSLog(@"num of arguments is %zd",signture.numberOfArguments);
    NSLog(@"arguments0 is %s",[signture getArgumentTypeAtIndex:0]);
    NSLog(@"arguments1 is %s",[signture getArgumentTypeAtIndex:1]);
    NSLog(@"arguments2 is %s",[signture getArgumentTypeAtIndex:2]);
    NSInvocation * invocation = [NSInvocati on invocationWithMethodSignature:signture];
    NSDictionary * dic = @{@"key":@"ss",@"key1":@"ss"};
    [invocation setArgument:&dic atIndex:2];
    [invocation setTarget:instance];
    [invocation setSelector:@selector(run:)];
    [invocation invoke];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,618评论 4 61
  • 《爱情觉醒地图》(李欣频著)读后感 让你受苦的“爱的错误信念”十问十答: 1、为什么我老是遇人不淑? 世上不...
    可妮彤阅读 2,555评论 0 0
  • 正遇初秋,这也是我最喜欢的季节。夏日的阳光不再毒辣而冬日的凛冽寒气也没有袭来。不由想起林语堂对初秋时节的动人描写:...
    杨静随笔阅读 3,283评论 0 0
  • 人参醋蛋液[玫瑰]适合体寒之人服用,大家对照看看: 体寒 “体寒”,以中医看,大部分叫做“虚寒”,就是体质虚且寒。...
    享受福袋阅读 4,490评论 0 2

友情链接更多精彩内容