iOS RunTime:用例

时间:2013-10-11 08:57:55

标签: ios objective-c runtime

我知道iOS Runtime很强大,我有一个问题:我们应该在哪里使用运行时?

例如,我发现很多文章都会讨论关于课堂和课程的内容。方法调整。在哪种情况下我应该使用它?

我也google它,并发现它被广泛用于越狱开发。但是,我是一个非越狱的开发者,请不要越狱〜

谢谢!

3 个答案:

答案 0 :(得分:7)

这是一个非常普遍的问题。运行时是一个与您的程序链接的库,它实现了Objective-C的一部分,因此它可以显示在任何地方。如果你不得不问,不要使用它。但是,这里有一些常见的用途:

混写

Swizzling是两种方法的标识符的交换,因此它们指向彼此的实现。这两种方法仍然可用。

使用swizzling而不是类别来保留方法的原始实现是有用的,并避免让两个类重写相同的方法(结果将是未定义的)。

请参阅https://stackoverflow.com/a/8636521/412916以获取危险列表。

动态方法(排序)

请参阅https://stackoverflow.com/a/13646650/412916

关联参考

关联引用是一种在不更改代码的情况下将实例变量添加到对象的方法。取消分配对象时,将自动删除关联引用。

Google it

反思

反省类的属性。例如,在JSON和模型的普通类之间进行映射。我想MantleOvercoat包装器就是这样的例子。

您应该阅读Objective-C Runtime Programming Guide

使用表情符号作为方法名称

这可能是最重要的用途。代码不是我的,我不记得原作者。

#include <objc/runtime.h>
#import <Foundation/Foundation.h>

@interface A: NSObject
@end

@implementation A

void pileOfPoo(id self, SEL _cmd) {
    NSLog(@"");
}

+ (BOOL)resolveInstanceMethod: (SEL)name {
    if ([NSStringFromSelector(name) isEqualToString: @""]) {
    class_addMethod([self class], name, (IMP)pileOfPoo, "v@:");
        return YES;
    } else return NO;
}
@end

int main(int argc, char *argv[]) {
    @autoreleasepool {
        A *a = [[A alloc] init];
        SEL aSelector = NSSelectorFromString(@"");
        [a performSelector: aSelector];
    }
    return 0;
}

答案 1 :(得分:1)

一般不应该使用它。当它被使用时,应该非常小心,因为当你犯错误时,破坏一切的风险很高。通常它只能在使用良好的代码中完成,最好保存为开源项目,以便许多人检查其有效性。

它不仅用于越狱,而且通常涉及私有类/方法,并允许您解决/扩展API中的限制。但它也可以用来扩展,例如,在某种关系中插入你自己的类作为观察者,这样它就可以采取一些行动,然后将信息转发给'真正的'观察者(AFNetworking用来做这个)。

通常,您应该使用类别或标准子类等功能来添加功能。

答案 2 :(得分:0)

在运行时调整方法是一个很好的措施来解决问题。无论你想要什么方法。为什么我们需要挂钩?挂钩有各种应用,如user behavior statistic,自动序列化等 在这里,我们将用户行为作为样本。在方法调配的帮助下,我们可以挂钩&#39; viewWillAppear&#39;任何UIViewController子类中的方法。这意味着我们可以知道何时查看会发现的问题。被调用,因此我们可以注入用户行为代码(例如,页面访问次数,页面访问持续时间)之前或之后的观看次数。方法。总之,借助方法调配,我们可以轻松实现用户行为统计。其他类型的应用是相同的。