类型编码
编码表
| Code | Meaning |
|---|---|
| c | A char |
| i | An int |
| s | A short |
| l | A long (l is treated as a 32-bit quantity on 64-bit programs.) |
| q | A long long |
| C | An unsigned char |
| I | An unsigned int |
| S | An unsigned short |
| L | An unsigned long |
| Q | An unsigned long long |
| f | A float |
| d | A double |
| B | A C++ bool or a C99 _Bool |
| v | A void |
| * | A character string (char *) |
| @ | An object (whether statically typed or typed id) |
| # | A class object (Class) |
| : | A method selector (SEL) |
| [array type] | An array |
| {name=type…} | A structure |
| (name=type…) | A union |
| bnum | A bit field of num bits |
| ^type | A pointer to type |
| ? | An unknown type (among other things, this code is used for function pointers) |
示例
在使用消息转发的时候,我们经常会用到到这个方法methodSignatureForSelector:
1 | - (NSMethodSignature *)methodSignatureForSelector:(SEL)selector |
该方法用来返回方法签名,即方法的返回值和参数。
在编译后的cpp文件中也会经常看到类似 v@:@ 的符号
在OC中方法调用,又称为向一个对象发送消息,比如:
1 | [receiver message] |
编译后就是这个样子:
1 | objc_msgSend(receiver, selector) |
objc_msgSend方法的文档:
1 | id objc_msgSend(id self, SEL op, ...) |
参数:
self 消息的接收者
op 消息的selector
… 消息传入参数的数组
“v”:代表返回值void,其实就对应着objc_msgSend的返回值
“@”:代表一个id类型的对象,也就是消息的receiver
“:”:代表SEL
“@”:代表参数,该参数是个id类型对象
再看一个例子
1 | - (BOOL)hasLoadData:(NSString *)url |
其ObjCTypes为:B@:@:
“B”:代表返回值是BOOL
“@”:代表一个id类型的对象,也就是消息的receiver
“:”:代表SEL
“@”:代表参数,该参数是个id类型对象,也就是url
那么我们是怎么确定这个ObjCTypes的呢?
通过encode() 函数,// NSLog(@”%s”,@encode(BOOL))的结果为B
看官方文档Type Encodings,这里面列了具体的对应关系