首页 > 系统 > iOS > 正文

iOS NSValue 和 @encode 详解

2019-11-06 09:43:35
字体:
来源:转载
供稿:网友

一、NSValue 很有用的包装对象的两个用法

NSData*data = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:@"www.baidu.com"]]; /** 用 NSValue 包装 Objective-C 对象 */ NSValue *value = [NSValue valueWithBytes:&data objCType:@encode(NSString)]; NSLog(@"%@",value); /** NSValue 创建并返还一个包含给定对象的 */ NSObject*objc = [NSObject new]; NSValue * value2 = [NSValue valueWithNonretainedObject:objc]; NSLog(@"%@",value2);

二、关于 @encode

意义:@编译器指令 之一,返回一个给定类型编码为一种内部表示的字符串(例如,@encode(int) → i),类似于 ANSI C 的 typeof 操作。苹果的 Objective-C 运行时库(runtime)内部利用类型编码帮助加快消息分发。

Objective-C Type Encodings

编码 意义c ---> A chari ---> An ints ---> A shortl ---> A longl is treated as a 32-bit quantity on 64-bit PRograms.q ---> A long longC ---> An unsigned charI ---> An unsigned intS ---> An unsigned shortL ---> An unsigned longQ ---> An unsigned long longf ---> A floatd ---> A doubleB ---> A C++ bool or a C99 _Boolv ---> 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 unionbnum ---> A bit field of num bits^type ---> A pointer to type? ---> An unknown type (among other things, this code is used for function pointers)

我们也可以尝试去打印这些值

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)));Method EcodingMethodEcoding.png这里有需要注意的是:指针的标准编码是加一个前置的 ^,而 char 拥有自己的编码 。这在概念上是很好理解的,因为 C 的字符串被认为是一个实体,而不是指针。BOOL 是 c,而不是某些人以为的 i。原因是 char 比 int 小,且在 80 年代 Objective-C 最开始设计的时候,每一个 bit 位都比今天的要值钱(就像美元一样)。BOOL 更确切地说是 signed char (即使设置了 -funsigned-char 参数),以在不同编译器之间保持一致,因为 char 可以是 signed 或者 unsigned。直接传入 NSObject 将产生 #。但是传入 [NSObject class] 产生一个名为 NSObject 只有一个类字段的结构体。很明显,那就是 isa 字段,所有的 NSObject 实例都用它来表示自己的类型。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表