一,关联 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. 一般来说,主方法main()结束的时候线程结束

    suspend()是将一个运行时状态进入阻塞状态(注意不释放锁标记).恢复状态的时候用resume().Stop()指释放全部. 这几个方法上都有Deprecated标志,说明这个方法不推荐使用. 一 ...

  2. Laravel5.1 搭建博客 --编译前端文件

    上篇文章写了Gulp编译前端文件,这篇记录下在搭建博客中使用Gulp 1 引入bootstrap和js 1.1 首先先在项目本地安装Bower sudo npm install bower 1.2 创 ...

  3. 提高ASP.NET网站性能的方法

    http://www.360doc.com/content/14/0705/18/7662927_392224856.shtml   Asp.NET有许多秘密,当你了解了这些秘密后,可以使得你的ASP ...

  4. 编程之美 set 3 最大公约数问题

    解法 1. f(x,y) = f(y, y%x) (y>0) 辗转相除法 2. 取模运算较为耗时, 将取模变成相减. 但对极端数据效果很差, 比如 gcd(1000,1) 3. 分析公约数的特点 ...

  5. HttpModule,HttpContext,HttpHandler

    http://www.cnblogs.com/wujy/tag/ASP.NET%E5%9F%BA%E7%A1%80/ http://www.th7.cn/Program/net/2011/12/26/ ...

  6. 后Hadoop时代的大数据架构

    提到大数据分析平台,不得不说Hadoop系统,Hadoop到现在也超过10年的历史了,很多东西发生了变化,版本也从0.x进化到目前的2.6版本.我把2012年后定义成后Hadoop平台时代,这不是说不 ...

  7. java中计算时间差

    Calendar cale = null; SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" ...

  8. open live writer 代码着色插件

    插件地址1: http://files.cnblogs.com/files/zsy/OpenLiveWriter.CNBlogs.SourceCode.zip 下载,解压,把里面的文件放到最新的 ap ...

  9. jenkins提交SVN文件

    需求背景: 公司有内网和外网两台SVN服务器,都需要维护相同的配置文件,但是我们想能否在内网修改配置文件后同时提交到外网SVN服务器上. 开发人员操作步骤 1.开发人员在IDE中checkout内网c ...

  10. 170330、Spring中你不知道的注入方式

    前言 在Spring配置文件中使用XML文件进行配置,实际上是让Spring执行了相应的代码,例如: 使用<bean>元素,实际上是让Spring执行无参或有参构造器 使用<prop ...