@encode编译器指令和Objective-C类型编码介绍

@encode指令用于获取Objective-C类型的编码字符串,用于编译时类型检查和运行时的消息分发。本文深入探讨了Objective-C类型编码和方法编码,提供打印及使用类型编码的实际示例。

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]);  
            }  
        }  
    }  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值