IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Objective-C Runtime Programming -> 正文阅读

[游戏开发]Objective-C Runtime Programming

参考资料:Objective-C Runtime Programming Guide

1、Messaging

OC 中执行方法的形式为:[receiver message],运行时绑定方法的具体实现。编译器将其转化为:objc_msgSend(receiver, selector, arg1, arg2, ...)。调用实现方法时会多传入两个隐藏参数:

  • _cmd: 对应方法的selector
  • self: 调用方法的对象

编译器为每个class & object生成:

  • A pointer to the superclass.
  • A class dispatch table.每项的内容是selector以及对应的address。利用- (IMP)methodForSelector:(SEL)aSelector可以获得函数指针,typedef id (*IMP)(id, SEL, ...);,在返回结果之后加()可以执行。

当一个实例对象被创建时,变量也会被初始化,在变量之上会有一个pointer指向class structure

instanceclass structure可以总结如下:

为了加速消息转发,runtime system会对用到的SEL -> IMP进行缓存。首先判断当前对象是否有对应的IMP,其次向上以此判断父对象,如果都找不到,会在下面介绍的三种方法中进行动态决议。

2、Dynamic Method Resolution

通过resolveInstanceMethod: and resolveClassMethod:动态的为类/实例添加方法而不用事先声明,如果命中了SEL并且有对应的实现,就可以保证运行时调用未声明的方法而不会崩溃。由于Xcode编辑时会检查某个类有没有实现某个方法,所以为了保证编译通过,可用performSelector执行方法。

#include <objc/runtime.h>
///
void dynamicMethodIMP(id self, SEL _cmd) {
    // implementation ....
    NSLog(@"%@", NSStringFromSelector(_cmd));
}
///
+ (BOOL)resolveInstanceMethod:(SEL)sel {
    if (sel == @selector(xxx)) {
        class_addMethod([self class], sel, (IMP)dynamicMethodIMP, "v@:");
        return YES;
    }
    return [super resolveInstanceMethod:sel];
}

3、Forwarding

如果在上一步没有动态添加成功,还可以通过forwardingTargetForSelector将消息转发给其它对象执行,类似于多继承。如果返回nil,则此方法行不通。切记不可放回self,否则会造成死循环。

- (id)forwardingTargetForSelector:(SEL)aSelector {
    NSLog(@"%@ %@", self, NSStringFromSelector(_cmd));
    return [xxx new];
}

上边的方法执行失败后,还有最后一种方法可以挽回局面。

-(void)forwardInvocation:(NSInvocation*)anInvocation {
    NSLog(@"%@ %@", self, NSStringFromSelector(_cmd));
    if ([xxx instancesRespondToSelector:anInvocation.selector]) {
        [anInvocation invokeWithTarget:[xxx new]];
    } else {
        [super forwardInvocation:anInvocation];
    }
}

/*必须重写这个方法,消息转发机制使用从这个方法中获取的信息来创建NSInvocation对象 返回nil上面方法不执行*/

- (NSMethodSignature*)methodSignatureForSelector:(SEL)aSelector {
    NSLog(@"%@ %@", self, NSStringFromSelector(_cmd));
    NSMethodSignature*signature = [super methodSignatureForSelector:aSelector];
    if(!signature){
        if ([xxx instancesRespondToSelector:aSelector]){
            signature = [xxx instanceMethodSignatureForSelector:aSelector];
        }
    }
    return signature;
}

这种方法非常灵活,可以动态改变方法的target、selector、arguments、return,当然也是最耗费性能的。

值得注意的是如果调用if ([xxx respondsToSelector:@selector(xxx)])进行判断是否响应某消息,最多进行到Dynamic Method Resolution,如果找不到就认为不响应。

以上三种方法是依次执行的,越靠前解决越好,否则耗费更多的性能。

4、Declared Properties

通过以下方法可以获取一个类的属性名称以及修饰符:

id XXXClass = objc_getClass("XXX");
unsigned int outCount, i;
// 类似于数组指针的用法
objc_property_t *properties = class_copyPropertyList(LenderClass, &outCount);
for (i = 0; i < outCount; i++) {
    objc_property_t property = properties[i];
    fprintf(stdout, "%s %s\n", property_getName(property), property_getAttributes(property));
}

其中property_getAttributes获取到的结果是用符号来表示的,比如@property (nonatomic, copy) NSArray *array;,运行的结果是:
T@"NSArray",C,N,V_arrayT 表示编码类型,C表示copyN表示nonatomicV_后面就是属性的命名。

其它符号的含义可见 👉

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:59:49  更:2022-03-30 19:01:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:53:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码