类型编码

类型编码

编码表

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
2
3
4
5
6
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
{
if (self.target == nil)
return [NSMethodSignature signatureWithObjCTypes:"v@:@"];
return [self.target methodSignatureForSelector: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,这里面列了具体的对应关系