闻道丶iOS(尝鲜版)iOS Developerruntime学习

01 runtime用法之发送消息

2017-03-24  本文已影响29人  小码码

1 runtime简介

2 消息机制验证

int main(int argc, const char * argv[]) {
    @autoreleasepool {
      // 创建并初始化一个object对象
        NSObject *object= [NSObject alloc];
        object = [object init];
    }
    return 0;
}
int main(int argc, const char * argv[]) {
    /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool; 
        NSObject *object= ((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("NSObject"), sel_registerName("alloc"));
        object = ((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)object, sel_registerName("init"));
    }
    return 0;
}
 alloc对应的函数 :  objc_msgSend(objc_getClass("NSObject"), sel_registerName("alloc"));
 init对应的函数:  objc_msgSend(object, sel_registerName("init"));
// 第一个参数:谁发送消息,类名
// 第二个参数:发送一个什么样的消息,方法名

3 objc_msgSend方法的使用

OBJC_EXPORT void objc_msgSend(void /* id self, SEL op, ... */ )

要想使用runtime方法,需要进行如下配置:


// OC写法:
NSObject *objc = [NSObject alloc];
objc = [objc init];
// 纯runtime写法
NSObject *objc = objc_msgSend(objc_getClass("NSObject"), sel_registerName("alloc"));
objc = objc_msgSend(objc, sel_registerName("init"));
// runtime与OC的混合写法
NSObject *objc = objc_msgSend([NSObject class]), @selector(alloc));
objc = objc_msgSend(objc, @selector(init));
备注:
    // 谁的事情谁开头 -> 对象(objc)
    // objc_getClass(<#const char *name#>):根据类名获取类对象
    // 类方法用类对象,对象方法用对象
(1)场景:创建一个person类,并实现两个私有方法(没有声明的方法):
- (void)eat{  
    NSLog(@"吃东西");
}

- (void)run:(NSString *)name metre:(int)metre
{
    NSLog(@"%@跑了%d米", name ,metre);
}

(2)实现过程代码
    // 分配内存
    Person *p = objc_msgSend([Person class], @selector(alloc)); 
    // 初始化
    p = objc_msgSend(p, @selector(init));
    // 调用eat方法(没有参数)
    objc_msgSend(p, @selector(eat)); 
    // 调用run方法(有参数)
    objc_msgSend(p, @selector(run:metre:),@"小明", 100);

4 消息机制使用场景

上一篇 下一篇

猜你喜欢

热点阅读