美文网首页
iOS runtime方法交换,动态添加属性

iOS runtime方法交换,动态添加属性

作者: 浅宇落 | 来源:发表于2018-05-06 20:52 被阅读0次

    runtime在项目中越来越常见,学会runtime还是需要的,废话不多说,直接进入主题。

    1.使用runtime实现方法交换

    例如:加载图片,[UIImage imageNamed:@"timg"]返回图片是否加载成功结果,系统方法没有返回结果,就需要我们方法交换来实现了。

    1.1先创建一个UIImage的类别

    在.m文件中实现以下方法

    + (void)load {

        //方法交换

        //类方法

        MethodimageNamedMethod =class_getClassMethod(self,@selector(imageNamed:));

        Methodlzy_imageNamedMethod =class_getClassMethod(self,@selector(lzy_imageNamed:));

        method_exchangeImplementations(imageNamedMethod, lzy_imageNamedMethod);

        //对象方法

        //class_getInstanceMethod(<#Class  _Nullable __unsafe_unretained cls#>, <#SEL  _Nonnull name#>)

    }

    ///加载图片 返回成功/失败

    + (UIImage*)lzy_imageNamed:(NSString*)name {

        UIImage*image = [selflzy_imageNamed:name];

        if(image) {

            NSLog(@"加载图片成功");

        }else{

            NSLog(@"加载图片失败");

        }

        returnimage;

    }

    1.2使用

    导入头文件 #import "UIImage+Image.h"

    //加载UIImage 返回成功/失败

    UIImage*image = [UIImageimageNamed:@"timg"];

    2.动态添加属性

    2.1创建一个NSObject类别

    在.h文件中添加属性 name

    @interfaceNSObject (Property)

    ///名称 分类中的属性  只有声明的setter,getter方法, 没有实现的setter,getter方法, 也没有下划线成员变量

    @property (nonatomic, copy) NSString *name;

    @end

    在.m文件中实现setter,getter方法

    - (void)setName:(NSString*)name {

        //添加属性 与 类关联

        objc_setAssociatedObject(self, "name", name, OBJC_ASSOCIATION_COPY);

    }

    - (NSString*)name {

        return objc_getAssociatedObject(self, "name");

    }

    2.2使用

    导入头文件 #import "NSObject+Property.h"

    //创建NSObject

        NSObject*object = [[NSObjectalloc]init];

        object.name = @"runtime动态添加属性";

        NSLog(@"%@", object.name);

    Demo地址: Demo地址

    如有错误,请指出

    相关文章

      网友评论

          本文标题:iOS runtime方法交换,动态添加属性

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