美文网首页
OC - runtime常见用法小结

OC - runtime常见用法小结

作者: herui201211 | 来源:发表于2017-05-19 20:08 被阅读19次
消息机制 - 调用私有方法

OC的runtime特性,使其没有严格意义上的私有方法。

objc_getClass()
sel_registerName()
objc_msgSend()

例:
@interface MyObjcet : NSObject
@end

@implementation MyObjcet
- (void)myFunction
{
    NSLog(@"myFunction");
}
@end

//即使myFunction方法没有通过.h暴露出来,也是可以调用成功的。
MyObjcet *obj = [MyObjcet new];
objc_msgSend(obj, sel_registerName("myFunction"));

方法交换

很多时候,我们想要对系统框架的某些方法添加一些自定义逻辑。继承是个解决办法,但得改代码,如何尽可能少的侵入项目呢?

class_getClassMethod()
class_getInstanceMethod()
method_exchangeImplementations()

例: NSMutableDictionary的setObject:forKey:方法,当obj为nil的时候就会抛异常。多写几个if其实也ok,可是...
+ (void)load
{
  Class clas = [object_getClass([NSMutableDictionary dictionary]) class];
  Method original = class_getInstanceMethod(clas, @selector(setObject:forKey:));
  Method new = class_getInstanceMethod(clas, @selector(he_setObject:forKey:));
  method_exchangeImplementations(original, new);
}

@implementation NSMutableDictionary (HECrashHandle)
- (void)he_setObject:(id)anObject forKey:(id<NSCopying>)aKey{
    if(aKey == nil) return;
    if(anObject == nil){
        [self removeObjectForKey:aKey];
    }else{
        [self he_setObject:anObject forKey:aKey];
    }
}
@end


分类中添加属性

分类的初衷是为扩展方法而存在的,但很多时候我们需要在分类中添加属性以满足需求。

objc_setAssociatedObject()
objc_getAssociatedObject()

例: 为UIView添加属性myDesc

@interface UIView (Desc)
@property NSString *myDesc;
@end

@implementation UIView (Desc)
- (NSString *)myDesc
{
    return objc_getAssociatedObject(self, _cmd);
}
- (void)setMyDesc:(NSString *)myDesc
{
    objc_setAssociatedObject(self, @selector(myDesc), myDesc, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
@end

添加方法

这个我这没怎么用上,如果有好的使用场景,欢迎在下方的评论区一起交流

resolveClassMethod:
resolveInstanceMethod:
class_addMethod()

示例:
void myMethodIMP(id self, SEL _cmd) { .... }

@implementation MyClass
+ (BOOL)resolveInstanceMethod:(SEL)aSEL
{
    if (aSEL == @selector(resolveThisMethodDynamically)) {
          class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP, "v@:");
          return YES;
    }
    return [super resolveInstanceMethod:aSEL];
}
@end

相关文章

  • OC - runtime常见用法小结

    消息机制 - 调用私有方法 OC的runtime特性,使其没有严格意义上的私有方法。 方法交换 很多时候,我们想要...

  • Objective-C的运行时常用方法

    前言 runtime是OC成为面向对象的基础,了解runtime的基础用法对理解OC非常必要。大量的开源库,如MJ...

  • runtime(四)-常见操作

    runtime很复杂庞大,懂了oc对象布局,理解了发消息过程和消息转发流程,还不够。接下来再学习一些常见用法,因为...

  • Runtime消息转发及其应用

      之前写过文章Runtime的常见用法里面有介绍过利用Objective-C的Runtime特性来给Catego...

  • OC runtime常见应用

    那什么是OC runtime 简单来说,Objective-C runtime是一个实现Objective-C语言...

  • runtime常见用法三

    问题: 首先我们先来了解一下字典转模型,当我们从服务器请求并解析完数据后,我们通常需要把解析后得到的字典转为模型(...

  • OC-Runtime-Class结构和OC消息机制

    OC - Runtime - Class 结构 和 OC 消息机制 Runtime 源码中 Class 结构如下:...

  • 面试技巧攻克-OC高级特性

    作者:iOS大蝠 一、runtime机制 1、什么是runtime? runtime是OC的重要特性,使得OC语言...

  •  Runtime简介以及常见的使用场景

    Runtime简介以及常见的使用场景 Runtime简称运行时,是一套比较底层的纯C语言的API,作为OC的核心...

  • OC Runtime 常见的应用

    OC Runtime特性让他具有一些新功能,可以应用在日常的工作中,下面介绍 Runtime 中常见的应用,可以简...

网友评论

      本文标题:OC - runtime常见用法小结

      本文链接:https://www.haomeiwen.com/subject/goisxxtx.html