美文网首页iOS 学习笔记
Runtime的用法(上):给category 添加属性 和方法

Runtime的用法(上):给category 添加属性 和方法

作者: Misaki_yuyi | 来源:发表于2018-01-08 21:41 被阅读51次

很长时间都没有静下心来写博客了。

  这半年,原生iOS基本上没有开发任务,都是一些无关紧要的迭代。大部分开发时间放在了前端angular项目上,现在的前端水平也仅仅是,依葫芦画瓢,刚好完成开发任务而已。iOS的基础东西虽然说没有丢,但是一直没有往更深的方向去专研,Swift也是刚好会用,没有深究。温水煮青蛙,和刚进公司的那一会比,心态差距很大。今天把一些基础性的东西runtime,重拾一下吧。

  • runtime 给category 添加属性

category和继承,有相似的功能。继承既能添加方法,也能添加成员变量。继承是子类继承自父类,子类中增加的方法不会成为父类的一部分。category可以在不知道类源码的情况下,为类添加新方法,不能添加成员变量,但是可以用过runtime来实现。以前项目中很多通用的属性都用继承实现,但是不太好维护(安慰自己罢了☺,两年了,一直都是自己一个人维护项目),改成category来实现。

#import <UIKit/UIKit.h>

@interface UIViewController (Extension)

@property (nonatomic,copy) NSString * fileName;

@end
#import "UIViewController+Extension.h"

#import <objc/runtime.h>

@implementation UIViewController (Extension)

//getter
- (void)setFileName:(NSString *)fileName
{
    objc_setAssociatedObject(self, @selector(fileName), fileName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

//setter
- (NSString *)fileName
{
    NSString * _fileName = objc_getAssociatedObject(self, @selector(fileName));
    if (!_fileName)
    {
        _fileName = @"xx.mp3";
        objc_setAssociatedObject(self, @selector(fileName), _fileName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    return _fileName;
}
  • runtime 来替换方法

这个其实很多地方都用到了,比如用NullSafe来避免遇到null崩溃等。

+ (void)load
{
    //类加载时调用,确保只执行一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        //原始方法 这里只是举例,viewWillAppear
        Method originalM = class_getClassMethod([self class], @selector(viewWillAppear:));
        
        //自定义方法
        Method customM = class_getClassMethod(self, @selector(yy_viewVillAppear:));
        
        //交换
        method_exchangeImplementations(originalM, customM);
        
    });
}

- (void)yy_viewVillAppear:(BOOL)animated
{
    NSLog(@"%s",__FUNCTION__);
    
    //这里已经替换了方法viewWillAppear,所以不是递归调用
    [self yy_viewVillAppear:animated];
}

下篇的传送门Runtime的用法(下):给Model赋值

相关文章

网友评论

    本文标题:Runtime的用法(上):给category 添加属性 和方法

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