一、NSValue概述
NSValue类是NSNumber类的父类,也是一个类簇,NSNumber类用于对简单数据类型进行装箱,变成对象;NSValue类用于对复杂数据类型(指针、结构体)进行装箱,变成对象。
二、NSValue的使用
1.创建对象--装箱
将结构体封装成对象,以对象的形式展现
#import <Foundation/Foundation.h> struct Student{ int age; float score; char * name; } s1={12, 82.5f, "Andy"}; int main(int argc, const char * argv[]) { @autoreleasepool { //NSValue是NSNumber的父类,也是一个类簇。用来把指针、结构体等复杂数据类型存储为对象。 NSValue * value = [[NSValue alloc] initWithBytes: &s1 objCType: @encode(struct Student)]; /*参数1:地址 参数2:类型唯一标志,是一个字符串 */ NSLog(@"%s", @encode(int)); //i NSLog(@"%s", @encode(struct Student));//{Student=if*}, i-int, f-float, *-string } return 0; }
理解@encode的作用:它以简写的字符串形式来表示一个类型。
i-->int
f-->float
*-->string
2.判断一个value是否属于某个对象类型
if( strcmp(value.objCType, @encode(struct Student)) == 0){ NSLog(@"This value' type is struct Student."); } }
struct Student s2; [value getValue: &s2]; NSLog(@"%@", value); NSLog(@"age=%d, score=%f, name=%s", s2.age, s2.score, s2.name);
上面已经演示了如何对结构体数据类型进行装箱和拆箱,这里演示的是如何对指针数据类型进行装箱和拆箱。
//装箱 char * p = (char *) 0x1f; NSValue * value = [[NSValue alloc] initWithBytes: &p objCType:@encode(char *)]; //拆箱 char * p2; [value getValue: &p2]; NSLog(@"%p", p2);
//OC中有几个常用的结构体 CGPoint point; CGSize size; CGRect rect; NSValue * pointValue = [NSValue valueWithPoint:point]; NSValue * sizeValue = [NSValue valueWithSize:size]; NSValue * rectValue = [NSValue valueWithRect:rect]; NSValue * rangeValue = [NSValue valueWithRange:NSMakeRange(3, 4)];
@诗未冷学习博客