0x01 encode编译器指令
@encode是编译器指令之一。
@encode返回一个给定的Objective-C 类型编码(Objective-C Type Encodings)。
这是一种内部表示的字符串,类似于 ANSI C 的 typeof 操作。
苹果的 Objective-C 运行时库(runtime)内部利用类型编码帮助加快消息分发。
0x02 Objective-C类型编码

0x03 Objective-C方法编码

0x04 打印类型编码举例
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"int : %s", @encode(int));
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)));
return 0;
}
}
/*
Output:
2018-07-27 03:34:54.610 test[3084:97707] int : i
2018-07-27 03:34:54.611 test[3084:97707] float : f
2018-07-27 03:34:54.611 test[3084:97707] float * : ^f
2018-07-27 03:34:54.611 test[3084:97707] char : c
2018-07-27 03:34:54.611 test[3084:97707] char * : *
2018-07-27 03:34:54.611 test[3084:97707] BOOL : c
2018-07-27 03:34:54.612 test[3084:97707] void : v
2018-07-27 03:34:54.612 test[3084:97707] void * : ^v
2018-07-27 03:34:54.612 test[3084:97707] NSObject * : @
2018-07-27 03:34:54.612 test[3084:97707] NSObject : {NSObject=#}
2018-07-27 03:34:54.612 test[3084:97707] [NSObject] : #
2018-07-27 03:34:54.612 test[3084:97707] NSError ** : ^@
2018-07-27 03:34:54.612 test[3084:97707] int[] : [5i]
2018-07-27 03:34:54.612 test[3084:97707] float[] : [3f]
2018-07-27 03:34:54.612 test[3084:97707] struct : {_struct=sqQ}
Program ended with exit code: 0
*/
0x05 类型代码的实用方法
遍历NSArray或NSDictionary的时候,我们可能需要判断当前位置的数据类型,再决定对应的操作方法:
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES],@"key1",
[NSNumber numberWithDouble:1.00f],@"key2",
[NSNumber numberWithInt:1],@"key3",
[NSNumber numberWithFloat:33.0f], @"key4",
nil];
//快速枚举,仅适用于Objective-C 2.0
for(NSString *key in dic){
id value = [dic valueForKey:key];
if([value isKindOfClass:[NSNumber class]]){
const char * pObjCType = [((NSNumber*)value) objCType];
if (strcmp(pObjCType, @encode(int)) == 0) {
NSLog(@"字典中key=%@的值是int类型,值为%d",key,[value intValue]);
}
if (strcmp(pObjCType, @encode(float)) == 0) {
NSLog(@"字典中key=%@的值是float类型,值为%f",key,[value floatValue]);
}
if (strcmp(pObjCType, @encode(double)) == 0) {
NSLog(@"字典中key=%@的值是double类型,值为%f",key,[value doubleValue]);
}
if (strcmp(pObjCType, @encode(BOOL)) == 0) {
NSLog(@"字典中key=%@的值是bool类型,值为%i",key,[value boolValue]);
}
}
}
@encode指令用于获取Objective-C类型的编码字符串,用于编译时类型检查和运行时的消息分发。本文深入探讨了Objective-C类型编码和方法编码,提供打印及使用类型编码的实际示例。

1万+

被折叠的 条评论
为什么被折叠?



