OC中类别(Category)的属性

2019-12-05  本文已影响0人  一叶知秋0830

原则上来说类别(分类)中只可以添加方法,不可以添加属性和成员变量(只是理论上不能添加属性,实际上是可以通过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
上一篇 下一篇

猜你喜欢

热点阅读