在項目中經常會發現一些奇怪的功能。不太能找的到代碼的出處,但卻實現了功能,很可能這是實用了運行時的東西。
運行時即Runtime 。使用起來很有意思。多了解也有助於對oc的理解。
這裡我有寫個關於Runtime 的demo https://github.com/WangFeiF/WFRuntime
在這個博客裡只是demo的摘要。詳細可以下載demo。查看源碼。
// // ViewController.m // Runtime // // Created by 王飛 on 16/5/8. // Copyright © 2016年 com.wangfei. All rights reserved. // #import "ViewController.h" #import#import "WFPerson.h" #import "UIImage+Swizzling.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageOrigin; @property (weak, nonatomic) IBOutlet UIImageView *imageSwizzling; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [self sendMessage]; [self methodSwizzling]; } - (void)sendMessage { #pragma 消息機制 Class classPerson = objc_getClass("WFPerson"); // 同過類創建實例對象 // 如果這裡報錯,請將 Build Setting -> Enable Strict Checking of objc_msgSend Calls 改為 NO WFPerson *person = objc_msgSend(classPerson, @selector(alloc)); person = objc_msgSend(person,@selector(init)); // [person eat]; objc_msgSend(person,@selector(runWithCount:),10); objc_msgSend(person, @selector(eat)); #pragma 動態關聯方法 /** * person 對象並沒有 sayHello 方法 這時候 用WFPerson 內部的hello 代替 sayHello */ objc_msgSend(person, @selector(sayHello)); #pragma 消息轉發 /** * person 發給stoke 的方法,通過黑魔法操作,轉給了 touch */ objc_msgSend(person, @selector(stoke)); } #pragma 方法交換 詳細操作 看UIImage+Swizzling的分類 - (void)methodSwizzling { UIImage *image = [UIImage imageNamed:@"hitLive"]; _imageOrigin.image = image; NSLog(@"--------這是分界線---------"); UIImage *imge = [UIImage tuc_imageNamedMethod:@"hitLive"]; _imageSwizzling.image = imge; } @end