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];

    }

}




你可能感兴趣的:(iOS 面试题 之method swizzling)