美文网首页iOS学习开发iOS DeveloperiOS学习笔记
让category支持添加属性与成员变量

让category支持添加属性与成员变量

作者: 阿鑫iOS | 来源:发表于2016-03-15 00:21 被阅读412次

    很多时候,开发者为了便捷开发,常常会为类添加一些方法和属性,以便于节约时间成本。 

    来讲讲今天碰到的问题,我通过category继承与Uiview创建了一个类,在类的.h文件中声明了属性

    @property (nonatomic,copy) NSString *strFoodId;

    写好构造方法调用时发现会崩溃

    后来我发现原因是这样的:Category是Objective-C中常用的语法特性,通过它可以很方便的为已有的类来添加函数。但是Category不允许为已有的类添加新的属性或者成员变量。

    这种情况下 ,当我们要强制为category添加属性时,可以使用objc_getAssociatedObject / objc_setAssociatedObject来访问和生成关联对象。通过这种方法来模拟生成属性;

    解决方法:首先在.m文件中添加runtime库

    #import <objc/runtime.h>

    然后我们定义一个方法

    #ifndef YYSYNTH_DYNAMIC_PROPERTY_OBJECT

    #define YYSYNTH_DYNAMIC_PROPERTY_OBJECT(_getter_, _setter_, _association_, _type_) \

    - (void)_setter_ : (_type_)object { \

    [self willChangeValueForKey:@#_getter_]; \

    objc_setAssociatedObject(self, _cmd, object, OBJC_ASSOCIATION_ ## _association_); \

    [self didChangeValueForKey:@#_getter_]; \

    } \

    - (_type_)_getter_ { \

    return objc_getAssociatedObject(self, @selector(_setter_:)); \

    }

    接着就可以实现(例子)

    #import "UIView+expect.h"

    @implementation UIView (expect)

    YYSYNTH_DYNAMIC_PROPERTY_OBJECT(strFoodId, setStrFoodId, COPY, NSString *);

    任何想要添加的属性 都可以使用这个方法来实现 ,还是很方便的。

    而且对于开发来说一般我们有个原则:能用category扩展就不用继承,因为随着继承深度的增加,代码的可维护性也会增加很多。

    相关文章

      网友评论

        本文标题:让category支持添加属性与成员变量

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