参考资料:yhawaii的专栏 个人笔记 感谢博主!
@encode()
为了更好的互操作性,Objective-C 的数据类型,甚至自定义类型、函数或方法的元类型,都可以使用 ASCII 编码。@encode(aType) 可以返回该类型的 C 字符串(char *)的表示。
我们知道我们可以在程序中可以用OC对象 isKindOfClass:([OC类名 Class])方法来判断某个对象是否是某个类的实例。但是这个方法只能用在苹果公布了相应类的API的情况,对于int,float类型的,根本在OC中就没有相应的API。因此,这个时候要想知道哪个对象是否是int,float类型,就需要用到@encode关键字。
下面是一些类经过@encode(aType)转换后的char* 表示:
Code | Meaning |
---|---|
c | A char |
i | An int |
s | A short |
l | A longl 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 |
? NSLog(@"int : %s", @encode(int)); NSLog(@"long : %s", @encode(long)); NSLog(@"float : %s", @encode(float)); NSLog(@"float * : %s", @encode(float*)); NSLog(@"char : %s", @encode(char)); NSLog(@"char * : %s", @encode(char *)); NSLog(@"BOOL : %s", @encode(BOOL)); NSLog(@"void : %s", @encode(void)); NSLog(@"void * : %s", @encode(void *));
NSLog(@"NSObject * : %s", @encode(NSObject *)); NSLog(@"NSObject : %s", @encode(NSObject)); NSLog(@"[NSObject] : %s", @encode(typeof([NSObject class]))); NSLog(@"NSError * : %s", @encode(typeof(NSError *)));
int intArray[5] = {1, 2, 3, 4, 5}; NSLog(@"int[] : %s", @encode(typeof(intArray)));
float floatArray[3] = {0.1f, 0.2f, 0.3f}; NSLog(@"float[] : %s", @encode(typeof(floatArray)));
typedef struct _struct { short a; long long b; unsigned long long c; } Struct; NSLog(@"struct : %s", @encode(typeof(Struct)));
/* 结果: int : i long : l float : f float * : ^f char : c char * : * BOOL : c void : v void * : ^v NSObject * : @ NSObject : {NSObject=#} [NSObject] : # NSError * : @ int[] : [5i] float[] : [3f] struct : {_struct=sqQ} */ | An unknown type (among other things, this code is used for function pointers) |