1. 程式人生 > >iOS 面試題 之method swizzling

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

    }

}