iOS Runtime-OC黑魔法 – iPhone手機開發 iPhone軟體開發教學課程

在項目中經常會發現一些奇怪的功能。不太能找的到代碼的出處,但卻實現瞭功能,很可能這是實用瞭運行時的東西。

運行時即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

 

You May Also Like