如何将非OC对象封装成OC对象,塞给数组等
1 //
2 // main.m
3 // NSValue
4 //
5 // Created by dingxiaowei on 13-5-17.
6 // Copyright (c) 2013年 dingxiaowei. All rights reserved.
7 //
8
9 #import <Foundation/Foundation.h>
10
11 //创建NSValue
12 void value(){
13 //创建一个point结构体,这个不是OC对象
14 CGPoint point=CGPointMake(10, 10);
15 //将结构体变量包装成一个对象
16 NSValue *value=[NSValue valueWithPoint:point];
17 //创建一个数组
18 NSMutableArray *array=[NSMutableArray array];
19 //将包装好的value放入数组中
20 [array addObject:value]; //添加这个对象的时候,做一次retain操作
21
22 //取出这个对象
23 value=[array lastObject];
24 //将NSValue对象转化成CGPoint结构体
25 CGPoint point2=[value pointValue];
26 //比较验证(比较取出来的对象跟之前的对象是否相同)
27 BOOL result = CGPointEqualToPoint(point2, point);
28 if(result==1){
29 NSLog(@"point=point2");
30 }
31 else{
32 NSLog(@"point!=point2");
33 }
34 //直接打印输出结构体
35 NSString *str=NSStringFromPoint(point2);
36 NSLog(@"取出来的point是:%@",str);
37 }
38
39 //宏定义
40 typedef struct {
41 int year;
42 int month;
43 int day;
44 } Date;
45 //将自定义的结构体塞到数组中
46 void value2(){
47 Date date={2013,5,17};
48 //NSLog(@"输入的date是:%i年%i月%i日",date.year,date.month,date.day);
49 //void *代表任何类型的指针,这里第一个参数要传一个void *类型(即这个date的地址)
50 //第二个参数是指这个数据的类型,char *是一个C语言类型的char类型的指针,@encode根据结构体类型,生成对于的类描述字符串
51 char *type=@encode(Date);
52 NSValue *value=[NSValue value:&date withObjCType:type];//这样就能成功的将一个结构体类型包装成一个OC对象
53 //取出包装好的结构体
54 //定义一个结构体变量
55 Date date1;
56 [value getValue:&date1];//将包装的结构体取出来,赋给date1,经过这个方法调用之后,date1里面就有值了
57 //取出类型描述字符串
58 //[value objCType]; //这里就等同于上面的type
59 //直接打印输出结构体
60 //NSString *str=NSStringFromPoint(date1); //由于不是使用的系统内置的结构体,所以不好使用它封装好的方法
61 NSLog(@"取出来的date1是:%i年%i月%i日",date1.year,date1.month,date1.day);
62 }
63
64 int main(int argc, const char * argv[])
65 {
66
67 @autoreleasepool {
68
69 //NSNumber只能包装数字,NSValue能包装所有的对象,如果我们向包装一个结构体,那就不能用NSNumber,只能用NSValue
70 //value();
71 value2();
72 }
73 return 0;
74 }