iOS 面试题 之method swizzling

现在iOS太几把难找工作了,少的可伶的面试题就显得非常重要了,今天给写一个利用运行时来实现交互方法的小demo,运行时几乎已经被问烂了,你可以说运行时可以交互方法,动态添加属性,已经获取类的成员变量,具体的功能就不一一说了,只是谈了一个具体实例应用。

需求:如果已经有的一个项目希望实现屏幕适配,那么图片的imageNamed方法必然已经不适用了,如果一个一个方法改的话,那就显得太low了。话不多说


直接上代码,核心思想就是搞一个image的分类,进行方法交换,新方法里面实现屏幕适配。

在分类方法中实现两个方法。这样后面的代码就可以不用处理了。这里特别提醒下,如果是想实现一个对象方法的替换的话,那么需要使用下面的获取对象类型的方法

//Method m3 = class_getInstanceMethod([UIImage class], @selector(xxx));

+(void)initialize{

    Method m1 = class_getClassMethod([UIImageclass], @selector(imageNamed:));

    Method m2 = class_getClassMethod([UIImageclass], @selector(imageWithName:));

    method_exchangeImplementations(m1, m2);

}

+(UIImage *)imageWithName:(NSString *)name{

    NSString * str = nil;

   

    if ([[[UIDevicecurrentDevice]systemVersion ]floatValue] >8.0)

    {

        //这里给的素材应该是前面的名称全部相同,后面拼接的不同,屏幕适配

        str = @"name";

    }else{

        str = @"name_8.0";

    }

    

    //如果这里不进行替换的话,那就会形成循环调用

    UIImage * image = [UIImageimageWithName:str];


    return image;

}


//这里再给大家演示一个如何替换数组的对象方法,这样如果有人添加了一个空的对象放到对象里面有会有奇妙的事情发生,一定要在项目中实现

+(void)load{

   

    Method m1 = class_getInstanceMethod( NSClassFromString(@"__NSArrayM"), @selector(addObject:));

    Method m2 = class_getInstanceMethod( NSClassFromString(@"__NSArrayM"), @selector(sq_addObject:));

    method_exchangeImplementations(m1, m2);

}

-(void)sq_addObject:(id)object{

    if (object == nil) {

        NSLog(@"你是傻逼吗");

    }else{

        [self sq_addObject:object];

    }

}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值