本文为L_Ares个人写作,以任何形式转载请表明原文出处。
关于什么是type encoding
,先往下看,看完了就知道了。
一、准备工作
先随便建一个可以在mac
上跑的commond line tool
。

然后就在main.m
中随意的建一个类,我继承于了NSObject
,大家可以随意,这不是重点。然后在main.m
中我初始化一个JDPerson
的实例对象。
#import <Foundation/Foundation.h>
@interface JDPerson : NSObject
@property (nonatomic,copy) NSString *jd_name;
@property (nonatomic,assign) int jd_age;
- (NSString *)study:(NSString *)something;
@end
@implementation JDPerson
- (NSString *)study:(NSString *)something
{
return something;
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
JDPerson *person = [[JDPerson alloc] init];
[person study:@"objc"];
NSLog(@"Hello, World!");
}
return 0;
}
二、Clang编译成.cpp
进入到当前的typeEncodes
项目main.m
所在的文件夹下。执行以下命令 :
clang -rewrite-objc main.m -o main.cpp
然后进到main.m
所在的文件夹下,会发现多处了main.cpp
的文件,打开它,搜索你自定的方法study
,你会找到一个_method_list_t
方法列表。
结果如下图所示 :

看我画黄框的地方,这个东西就是本节要说的type encoding
,类型编码。
三、举例说明
其实这个在苹果的开发者官网是有的,这里是Objective-C type encoding官网,有兴趣的可以自己看,我就举个例子说一下,这些符号都是什么。
因为会有一些地方要用到,所以在这里扩展记录。
我就以图2中画黄框的那个来举例,里面包含了返回值,包含了参数,算是比较全一点的。
1. type Encoding
-
第一个
@
: 一个对象(无论静态类型还是id类型),在这里指的就是那个NSString
类型的一个返回值。 -
24
: 24表示的是study
这个方法占用的位数,不是说这个方法里面的实现,就是单指这个方法。 -
第二个
@
: 又是一个对象,这个就是统配类型,typedef struct objc_object *id
,也就是你每个方法默认其实都是有一个id
参数的。 -
0
: 表示id
这个参数在这个方法的0位上,因为id
是结构体指针,所以0~7位都是id
的。 -
冒号:
: 代表sel
,方法编号。 -
8
: 从第8位开始就是sel
方法编号的存储位置了。 -
第三个
@
: 就是你传入的参数something
这个对象 -
16
: 就是从第16位开始是something
的位置。
type Encoding
的图 :

2. Property Type
还有一个Property Type
在_prop_list_t
里面。
拿图3中举例

-
T
: 就是Type
,让你声明类型 -
@
: 表示变量类型,比如@
后面的经过转译的NSString
。 -
C
: 就是copy
。 -
N
: 就是nonatomic
-
V
: 表示成员变量,或者说实例变量。
再上一个Apple Developer官网的图 :

网友评论