當一個APP用戶量大的時候,就須要給不一樣的用戶作標籤,用來彰顯身份.好比QQ的會員,VIP等不一樣的皮膚功能.git
imageNamed
方法替換成本身的方法MC_imageNamed
.在這方法裏面進行身份/權限的判斷.拼接不一樣的圖片名稱.達到換膚的目的.#import "UIImage+Helper.h" #import <objc/runtime.h> @implementation UIImage (Helper) + (void)load { // 獲取UIImage的imageNamed方法 Method imageNameddd = class_getClassMethod([UIImage class], @selector(imageNamed:)); // 獲取MC_imageNamed方法 Method MC_imageNamed = class_getClassMethod([UIImage class], @selector(MC_imageNamed:)); // 方法替換 method_exchangeImplementations(imageNameddd, MC_imageNamed); } + (nullable UIImage *)MC_imageNamed:(NSString *)name { // 用戶的權限 NSInteger roleId = 0; if (roleId == 0) { name = [NSString stringWithFormat:@"%@_normal",name]; } else { name = [NSString stringWithFormat:@"%@_vip",name]; } return [self MC_imageNamed:name]; } @end
imageView.image = [UIImage imageNamed:@"status"];
三.說明
1.須要導入<objc/runtime.h>
不導入會報錯
Declaration of 'Method' must be imported from module 'ObjectiveC.runtime' before it is required
github
Objective-C語言是一門動態語言,它將不少靜態語言在編譯和連接時期作的事放到了運行時來處理。這種動態語言的優點在於:咱們寫代碼時可以更具靈活性,如咱們能夠把消息轉發給咱們想要的對象,或者隨意交換一個方法的實現等。這種特性意味着objective-c不只須要一個編譯器,還須要一個運行時系統來執行編譯的代碼。對於Objective-C來講,這個運行時系統就像一個操做系統同樣:它讓全部的工做能夠正常的運行。這個運行時系統即Objc Runtime。Objc Runtime實際上是一個Runtime庫,它基本上是用C和彙編寫的,這個庫使得C語言有了面向對象的能力。runtime的強大之處在於它能在運行時建立類和對象。objective-c
2.換膚demo下載地址網絡