Swift和OC的一些不同
在些文章长按复制的Label的时候,使用到了一个方法
1 | objc_getAssociatedObject() |
使用Runtime对一个Object进行赋值取值,由于对Runtime用的还不如Java的Reflection多,匆匆忙忙的用了,被坑了一把
1 | //Object C |
key 参数的不同
通过函数定义可以看出来
- 在OC中的key是一个 const void * 类型,代表的是C语言的一个地址,可以是一个函数,也可以是一个变量
- 在Swift中使用的是一个UnsafeRawPointer的对象且为非空
如果使用字符串key进行操作
1 | //OC中不会报错 |
产生报错的原因就是在Swift中 对常量字符串的处理,并不一定是同一个地址 OC中是相当于把字符串的“someKey”的地址传入了方法,
OC中两次都是同一个地址,所以没问题,但是在Swift中两次字符串不一定是同一个地址,为了确保无误
1 | //声明一个全局变量 |
具体的原因可以去详读有关UnsafeRawPointer的官方文档
到底应该如何设置key
通常来讲,我们的key需要是一个在C语言可以被访问到,并且不会变的地址, 那么通常需要相当的就是 static 全局变量
1 | static char someObjectKey //使用 &someObjectKey 作为key值 |
既然是地址就可以,有一种更优雅的方法,就是直接使用当前函数的 “@selector” 的地址作为Key
1 | - (void)someFunction { |