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

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

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

@property (nonatomic,copy) NSString *strFoodId;

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

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

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

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

#import

然后我们定义一个方法

#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支持添加属性与成员变量)