类目

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]);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,302评论 19 139
  • 1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch...
    阳光的大男孩儿阅读 10,512评论 0 13
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,227评论 6 342
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 177,321评论 25 709
  • ·“蓉儿,蓉儿”。我唤了好久迟迟无人应答。不知这丫头去了哪里。那灯盏里的灯油已经燃尽,可这悦仰宫里并不黑暗,今日本...
    李阿琪大姐姐呦阅读 1,027评论 0 0

友情链接更多精彩内容