iOS Swizzle

利用运行时函数runtime交换2个方法的实现

+(void)load //第一次载入内存时候实现load方法
{ 

  //  class_getInstanceMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>) 对象方法
  //   class_getClassMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>) 类方法
  
    Method method1 = class_getClassMethod(self, @selector(imageNamed:));
    Method method2 = class_getClassMethod(self, @selector(imageWithName:));
    
    method_exchangeImplementations(method1, method2); 
}


1.保证NSMutableArray addobject对象不为空

+(void)load
{    
//直接[NSMutableArray class] 底层无法识别
    Method method1 = class_getClassMethod(NSClassFromString(@"__NSArrayM"), @selector(hm_addObject:));
    Method method2 = class_getClassMethod(NSClassFromString(@"__NSArrayM"), @selector(addObject:));
    
    method_exchangeImplementations(method1, method2);
    
}

+(void)wt_addObject:(id)object
{
    if (object != nil) {
        [self wt_addObject:object];
    }
}


2.防止数组越界

+(void)load
{
    Method method1 = class_getClassMethod(NSClassFromString(@"__NSArrayI"), @selector(wt_objectAtIndex:));
    Method method2 = class_getClassMethod(NSClassFromString(@"__NSArrayI"), @selector(objectAtIndex:));
    
    method_exchangeImplementations(method1, method2);
    
}

+(void)wt_objectAtIndex:(NSUInteger)index
{
    if (index < self.count) {
        return [self wt_objectAtIndex:index];
    }else{
        return nil;
    }
}


你可能感兴趣的:(iOS Swizzle)