现在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];
}
}