Objective-C 动态绑定 学习笔记

动态绑定是指在运行程序时(而不是在编译时)将消息与方法对应起来的处理过程。许多对象可能会实现相同的方法,调用方法的方式会动态的变化。因此,动态绑定实现了OOP的多态性。当然,通过动态绑定,因为可以消除用于多选场景的条件逻辑,从而可以降低程序的复杂度。
动态绑定是Objective-C的一种继承特性,它不需要任何特定的API。使用动态绑定可以将消息选择器设置为在运行程序时确定的变量。

使用:

@dynamic 可以告知编译器与属性关联的方法会以动态方式实现。NSObject类中含有resolveInstanceMethod:和resolveClassMethod:方法,能够以动态方式分别为指定的实例和类方法选择器提供给实现代码。你可以重写这些方法,以动态方式实现实例/类方法。例子:

+ (BOOL) resolveInstanceMethod:(SEL)sel {
    NSString *method = NSStringFromSelector(sel);
    if ([method hasPrefix:@"absoluteValue"]) {
        class_addMethod([self class], sel, (IMP)absoluteValue, "@@:@");
        NSLog(@"Dynamically added instance method %@ to class %@", method, [self class]);
    }

    return [super resolveInstanceMethod:sel];
}

id absoluteValue(id self, SEL _cmd, id value) {
    NSInteger intVal = [value integerValue];
    if (intVal < 0) {
        return [NSNumber numberWithInteger:(intVal * (-1))];
    }
    return value;
}

优点:

Objective-C程序通过动态加载功能可以根据需要加载可执行代码和源代码,而无须在程序启动时加载程序的所有组件。这种程序代码和数据资源的延迟加载方式可以提高程序的整体性能,因为它降低了对系统内存的需求。
该方式还提高了程序的可扩展性,因为能够使新软件在不更改已存在程序的情况下,以动态方式将新增代码添加到程序中。比如动态方式加载软件的包bundle。
包是一种软件交付机制,由具有标准层次结构的目录以及该目录中的可执行代码和源代码构成。包可以包含可执行代码、图像、音频文件和其他类型的代码与资源数据。它还含有一个运行时配置文件,即信息属性列表(info.plist)。包大致可以分为以下几类:

  • 应用程序包
  • 框架包
  • 可选加载包
//动态加载信息属性列表
NSBundle *bundle = [NSBundle mainBundle];
NSString *bundlePath = [bundle pathForResource:@"Info" ofType:@"plist"];

//动态加载框架对象
NSBundle *bundle = [NSBundle mainBundle];
id test = [[[bundle classNamed:@"Test"] alloc] init];

内省

由于Objective-C运行时行为与它编译时和链接时行为差异非常大,所以对象的内省就成为了一种关键功能。这样可以避免运行时错误,如消息分派错误、对对象想等的错误假设等。比如:

isKindOfClass:
respondsToSelector:
conformsToProtocol:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章