一,关联 objc_get

1)建立关联:objc_setAssociatedObject;该函数需要四个参数:源对象,关键字,关联的对象和一个关联策略;当源对象销毁,关联的对象也会被销毁

源对象: 即绑定者

关键字: 是一个void类型的指针。每一个关联的关键字必须是唯一的。通常都是会采用静态变量来作为关键字

关联的对象: 绑定到源对象身上的对象

关联策略: 表明了相关的对象是通过赋值,保留引用还是复制的方式进行关联的;还有这种关联是原子的还是非原子的。这里的关联策略和声明属性时的很类似。这种关联策略是通过使用预先定义好的常量来表示的。OBJC_ASSOCIATION_ASSIGN、OBJC_ASSOCIATION_RETAIN_NONATOMIC、OBJC_ASSOCIATION_COPY_NONATOMIC等

2)获取相关联对象:objc_getAssociatedObject:该函数需要两个参数:源对象,关键字

3)断开关联:断开关联是使用objc_setAssociatedObject函数,传入关联的对象为nil值即可。

使用函数objc_removeAssociatedObjects可以断开所有关联。通常情况下不建议使用这个函数,因为他会断开所有关联。只有在需要把对象恢复到“原始状态”的时候才会使用这个函数。

例子:

static char objKey;

NSArray * array =[[NSArray alloc] initWidthObjects:@"One", @"Two", @"Three", nil];

objc_setAssociatedObject(array, &objKey, @“对象”, OBJC_ASSOCIATION_RETAIN);

NSString * associatedObject = (NSString *)objc_getAssociatedObject(array, &objKey);

二,class_get

1)获得实例方法: Method m1 = class_getInstanceMethod([对象 class], @selector(对象方法));

2)获得类方法: Method m2 = class_getClassMethod([类 class], @selector(类方法));

3)方法互调: method_exchangeImplementations(m1, m2); 即执行方法m1变成执行是m2,执行方法m2变成执行是m1

例子:

  1. Person * p1 = [[Person alloc] init];
  2. Method m1 = class_getInstanceMethod([p1 class], @selector(对象方法));
  3. Method m2 = class_getClassMethod([Person class], @selector(类方法));
  4. NSLog(@"测试前:");
  5. [p1 对象方法];
  6. [Person 类方法];
  7. method_exchangeImplementations(m1, m2);
  8. NSLog(@"测试后:");
  9. [p1 对象方法];
  10. [Person 类方法];

输出:

  1. 2015-11-04 13:37:08.539 02-runtime[2776:69899] 测试前:
  2. 2015-11-04 13:37:08.539 02-runtime[2776:69899] this is a 对象方法 method
  3. 2015-11-04 13:37:08.539 02-runtime[2776:69899] this is a 类方法 method
  4. 2015-11-04 13:37:08.540 02-runtime[2776:69899] 测试后:
  5. 2015-11-04 13:37:08.540 02-runtime[2776:69899] this is a 类方法 method
  6. 2015-11-04 13:37:08.540 02-runtime[2776:69899] this is a 对象方法 method

三,_cmd的用法

_cmd在Objective-C的方法中表示当前方法的selector,正如同self表示当前方法调用的对象实例。NSStringFromSelector(_cmd)得到是方法的名称

例如

static char kExtendVarKey; // 键名

- (void)someCategoryMethod

{

NSString *extendVar = objc_getAssociatedObject(self, &kExtendVarKey);

if(!extendVar){

extendVar = @"someText";

objc_setAssociatedObject(self, &kExtendVarKey, extendVar, OBJC_ASSOCIATION_COPY_NONATOMIC);

}

}

等同于下面代码

- (void)someCategoryMethod

{

NSString *extendVar = objc_getAssociatedObject(self, _cmd);

if(!extendVar){

extendVar = @"someText";

objc_setAssociatedObject(self, _cmd, extendVar, OBJC_ASSOCIATION_COPY_NONATOMIC);

}

}

四,objc_msgSend:该函数至少有两个参数:objc_msgSend(消息的接受者, selector, param1, param2, …);

1)概念:其实每个类中都有一张方法列表去存储这个类中有的方法,当发出objc_msgSend方法时候,就会顺着列表去找这个方法是否存在,如果不存在,则向该类的父类继续查找,直到找到位置。如果始终没有找到方法,那么就会进入到消息转发机制;objc_msgSend被分为2个过程:1)在cache中寻找SEL。2)在MethodTable寻找SEL。

例子

id returnValue = [someObject messageName:parameter]; ======》 id returnValue = objc_msgSend(someObject,@selector(messageName),paramter)

Id returnValue = [super messageName:parameter]; ======》 id returnValue = objc_msgSendSuper(someObject,@selector(messageName),paramter)

常用的底层语法(objc_get,class_get,_cmd,objc_msgSend)的更多相关文章

  1. linux下常用语言的语法检查插件整理

    linux下常用语言的语法检查插件 可以结合vim语法检查插件syntastic使用,具体请参考syntastic使用说明 如php,sql,json,css,js,html,shell,c等语法插件 ...

  2. Freemaker FTL指令常用标签及语法

    https://blog.csdn.net/pengpengpeng85/article/details/52070602 FTL指令常用标签及语法 注意:使用freemaker,要求所有标签必须闭合 ...

  3. re 模块 常用正则表达式符号 最常用的匹配语法

      常用正则表达式符号1 '.'     默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行 '^'     匹配字符开头,若指定flags MULTILINE, ...

  4. update中加入select最常用的update语法

    update中加入select最常用的update语法 (转) (2010-08-20 11:40:16) 转载▼ 标签: it 分类: SQL 最常用的update语法是:UPDATE <ta ...

  5. 【知识库】-数据库_MySQL常用SQL语句语法大全示例

    简书作者:seay 文章出处: 关系数据库常用SQL语句语法大全 Learn [已经过测试校验] 一.创建数据库 二.创建表 三.删除表 四.清空表 五.修改表 六.SQL查询语句 七.SQL插入语句 ...

  6. FTL指令常用标签及语法

    FTL指令常用标签及语法注意:使用freemaker,要求所有标签必须闭合,否则会导致freemaker无法解析. freemaker注释:<#-- 注释内容 -->格式部分,不会输出 - ...

  7. golang: 常用数据类型底层结构分析

    虽然golang是用C实现的,并且被称为下一代的C语言,但是golang跟C的差别还是很大的.它定义了一套很丰富的数据类型及数据结构,这些类型和结构或者是直接映射为C的数据类型,或者是用C struc ...

  8. grep,awk和sed的常用命令和语法

    Grep的常用命令语法 1. 双引号引用和单引号引用在g r e p命令中输入字符串参数时,最好将其用双引号括起来.例如:“m y s t r i n g”.这样做有两个原因,一是以防被误解为 s h ...

  9. 常用的ement语法

    缩写语法: 介绍:Emmet 使用类似于 CSS 选择器的语法描述元素在生成的文档树中的位置及其属性. 声明:第一次写博客大家多多关照,如有错误或者需要补充的请到评论里留言,谢谢大家! 快速生成htm ...

随机推荐

  1. php -- php的事务处理

    MYSQL的事务处理主要有两种方法. 1.用begin,rollback,commit来实现 begin 开始一个事务 rollback 事务回滚 commit 事务确认 2.直接用set来改变mys ...

  2. 【BZOJ】1093: [ZJOI2007]最大半连通子图(tarjan+拓扑序)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1093 两个条件综合起来加上求最大的节点数,那么很明显如果是环一定要缩点. 然后再仔细思考下就是求da ...

  3. 辛星和您一起解析PHP中的单例模式

    事实上单例模式还是用的挺多的,要说到最经典的样例.可能就是操纵数据库的类了,它假设是单例的话,能够避免大量的new操作消耗资源,而假设系统中须要一个类来管理全局的信息,则把它用成单例也是非常不错的.由 ...

  4. ThinkPHP项目笔记之RBAC(权限)中篇

    现在,说说添加权限,权限管理列表 c.添加权限

  5. Loadrunner_http长连接设置

    最近协助同事解决了几个问题,也对loadrunner的一些设置加深了理解,关键是更加知其所以然. ljonathan http://www.51testing.com/html/48/202848-2 ...

  6. Android无线测试之—UiAutomator UiScrollable API介绍五

    滑动区域校准常量设置与获取 一.校准概念 校准常量指的是:滑动操作坐标时的偏移量,用来取偏移比例 二.相关API 返回值 API 描述 double getSwipeDeadZonePercentag ...

  7. 教你在Ubuntu上体验Mac风格

    导读 老实说,我是个狂热的 Ubuntu 迷,我喜欢 Ubuntu 默认的 Unity 主题样式外观.此外,还有很多关于 Ubuntu 14.04 的漂亮图标主题样式 可用来美化默认的外观.但正如我上 ...

  8. 20分钟成功编写bootstrap响应式页面 就这么简单

    最近发现一个叫 Bootstrap 的好东西,Bootstrap 是现在最流行的响应式 CSS 框架,它以移动设备优先,能够快速适应不同设备.使用它编写响应式页面快捷.方便,而且屏蔽了浏览器差异.使用 ...

  9. ORA-01102的解决办法

    启动数据库时报错了! SQL> startup mount ORACLE instance started. Total System Global Area  608174080 bytes ...

  10. python里的生成器

    author:headsen chen date:2018-03-22 10:59:46 notice:This article created by headsen chen himself and ...