类别
对于 iOS 开发者来说,对于类别肯定不陌生,在 OC 的API 中有很多的类都有自己的类别,既然如此,那么类别有哪些优点呢?
- 对现有类功能进行扩展;
- 分散类的实现;
- 对类中的方法归类,方便查阅、更新和维护;
该类别添加方法
这个就不用多说了,是个人都会。
给类别添加属性
在我们学习 OC 的时候,一般都是说是不能给类别添加属性的(这种太绝对的说法你相信吗),那么到底能不能给类别添加方法呢?答案当然是肯定的,就是能给类别添加属性。
给类别添加属性有两种情况下是可以的:
给类别添加只读属性,同时实现
getter
方法。
@property (nonatomic, readonly) NSUInteger count;
- (NSUInteger)count {
return self.length;
}-
使用 OC 的运行时关联特性,实现
setter
和getter
方法。
@property (nonatomic, strong) NSString *name;
NSString * const kName = @"Name";
- (void)setName:(NSString *)name {
objc_setAssociatedObject(self, (__bridge const void *)(kName), name, OBJC_ASSOCIATION_COPY);
}- (NSString *)name { return objc_getAssociatedObject(self, (__bridge const void *)(kName)); }
对于这里设置的属性 policy,对应设置属性时的 strong
、copy
、assign
、nonatomic
typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
OBJC_ASSOCIATION_ASSIGN = 0, /< Specifies a weak reference to the associated object. /
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /< Specifies a strong reference to the associated object.
* The association is not made atomically. /
OBJC_ASSOCIATION_COPY_NONATOMIC = 3, /< Specifies that the associated object is copied.
* The association is not made atomically. /
OBJC_ASSOCIATION_RETAIN = 01401, /< Specifies a strong reference to the associated object.
* The association is made atomically. /
OBJC_ASSOCIATION_COPY = 01403 /< Specifies that the associated object is copied.
* The association is made atomically. */
};
Demo
Demo 请戳 这里