原则上来说类别(分类)中只可以添加方法,不可以添加属性和成员变量(只是理论上不能添加属性,实际上是可以通过RunTime机制来添加的)。
如下所示,类别也可以和类一样通过@property
来添加属性,但是一般情况下不要这么做,因为如果直接和类一样来通过@property
来添加属性的话,编译和运行都不会报错,但是一旦程序中有地方通过self.deviceName
或_deviceName
的形式来访问属性或变量就会报错,因为类别的结构体指针中没有属性列表,所以类别中用@property
是不会生成带下划线的成员变量的,也不会生成setter/getter方法,所以编译或运行时因为找不到setter或getter方法而报错。
但在一些特殊情况下我们可以在类别中通过@property
来添加属性后手动在.m文件中实现setter和getter方法。如下所示是一个UIView的分类,通过@property
添加了一个x的属性,手动实现的setter/getter方法其实并不是直接设置的x或获取的x的值。或者可以通过runtime机制来添加属性。
// .h文件
@interface UIView (QJAddiontial)
@property (nonatomic, assign) CGFloat x;
@end
// .m文件
#import "UIView+QJAddiontial.h"
@implementation UIView (QJAddiontial)
- (void)setX:(CGFloat)x
{
CGRect frame = self.frame;
frame.origin.x = x;
self.frame = frame;
}
- (CGFloat)x
{
return self.frame.origin.x;
}
@end
需要注意的是,由于类别不能通过常规方法添加成员变量,所以下面这种写法是会报错的。
@interface Device (Aditional)
{
NSString *deviceType;
}
@end
网友评论