类目

作者: 蓝苹果不是烂苹果 | 来源:发表于2016-07-05 13:39 被阅读12次
category

类别的作用

  1. 为任何类添加新的方法,包括那些没有源代码的类,达到扩充类的功能;
  2. 将类的实现分散到多个不同文件或多个不同框架中;
  3. 使用类别创建前向引用:如果其他类中的方法未实现,在你访问其他类的私有方法时编译器报错,这时使用类别,在类别中声明这些方法(不必提供方法实现),编译器就不会再产生警告;
  4. 向对象添加非正式协议(所谓的非正式协议就是类别,即凡是NSObject或其子类的类别,都是非正式协议)。

类别的局限性

  1. 无法向类中添加新的实例变量,类别没有位置容纳实例变量。
  2. 名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法

补充

objc runtime 动态增加属性
OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key)
objc_setAssociatedObject
objc_setAssociatedObject(self, @selector(NoAutoSizing), @(NoAutoSizing), OBJC_ASSOCIATION_RETAIN);

方法总共四个参数,分别是绑定目标,关键字,绑定者,策略。
绑定目标,就是给谁绑定;
关键字就是给这个对象绑定一个属性,要有一个标示符去表示那个属性,调用这个属性的时候通过标示符去寻找这个属性;
绑定者,要为这个属性绑定的值;
策略就是说绑定的这个属性的引用机制。

objc_getAssociatedObject

两个参数,一个绑定目标,一个关键字,通过关键字从绑定目标中获取属性的值。

举例:

#import <UIKit/UIKit.h>

@interface UILabel (Associate)

- (void) setFlashColor:(UIColor *) flashColor;

- (UIColor *) getFlashColor;

@end
#import "UILabel+Associate.h"
#import <objc/runtime.h>

@implementation UILabel (Associate)

static char flashColorKey;

- (void) setFlashColor:(UIColor *) flashColor{
    objc_setAssociatedObject(self, &flashColorKey, flashColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (UIColor *) getFlashColor{
    return objc_getAssociatedObject(self,   &flashColorKey);
}

@end
UILabel *lab = [[UILabel alloc] init];
[lab setFlashColor:[UIColor redColor]];
NSLog(@"%@", [lab getFlashColor]);

相关文章

网友评论

      本文标题:类目

      本文链接:https://www.haomeiwen.com/subject/ysmhjttx.html