很多时候,开发者为了便捷开发,常常会为类添加一些方法和属性,以便于节约时间成本。
来讲讲今天碰到的问题,我通过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扩展就不用继承,因为随着继承深度的增加,代码的可维护性也会增加很多。
网友评论