Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

是否了解 Type Encoding? #60

Open
tbfungeek opened this issue Feb 9, 2020 · 0 comments
Open

是否了解 Type Encoding? #60

tbfungeek opened this issue Feb 9, 2020 · 0 comments

Comments

@tbfungeek
Copy link
Owner

Type Encoding 主要用于对方法的返回值,参数进行编码,在Runtime 中SEL只是一个方法名的标记,它不包含方法所属类的信息以及参数返回值信息。而方法参数及返回值信息是通过Type Encoding编码生成的,这个可以看下我的博客《iOS Runtime应用之Runtime API分类》

我举了一个例子:

+ (IDLReturnType *)testTypeEncoding:(NSString *)strValue intValue:(NSInteger)intValue {
    return [IDLReturnType new];
}

这里每个部分都包含两位,前面一个表示编码,后面表示这个数据对应的偏移量,返回的类型数据会将返回值放在最后面,所以****@32@0:8@16q24****对应部分的意义如下:

  • @32 返回值编码为@,也就是id类型,所处的偏移量为32。也就是q24的后面
  • @0 第一个参数的编码为@,也就是id类型,所处的偏移量为0,由于第一个参数恒为方法的接收者,所以是id类型。
  • :8 第二个参数的编码为: 也就是SEL类型,所处的偏移量为8,由于第二个参数恒为_cmd所以是SEL类型。
  • @16 第三个参数的编码为@ 也就是id类型,所处的偏移量为16,上面第三个参数为NSString*
  • q24 第四个参数的编码为q 也就是long long类型,由于用的是64位机器所以对得上。

还有一个是属性编码,包含了属性定义时候的一系列信息,它也是一个字符串,以逗号分割各个部分。比如:

@property(nonatomic, copy, readonly,getter=ageValue,setter=setAageValue:) NSString *age;

的属性编码如下所示:

****T@"NSString",R,C,N,GageValue,SsetAageValue:,V_age****

它各个部分的意思如下所示:

* T@"NSString" 属性类型为NSString
* R 属性类型为ReadOnly类型
* C 属性存储属性为Copy
* N 属性为nonatomic
* GageValue 属性指定getter方法为ageValue
* SsetAageValue: 属性指定setter方法为setAageValue:
* V_age 属性对应的实例变量为_age
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant