NSValue

1.NSValue基本概念

  • NSNumber是NSValue的子类, 但NSNumber只能包装数字类型

  • NSValue可以包装任意值

    • 因此, 可以用NSValue将结构体包装后,加入NSArray\NSDictionary中

2. 常见结构体的包装

  • 为了方便 结构体 和NSValue的转换,Foundation提供了以下方法
  • 将结构体包装成NSValue对象
+ (NSValue *)valueWithPoint:(NSPoint)point;
+ (NSValue *)valueWithSize:(NSSize)size;
+ (NSValue *)valueWithRect:(NSRect)rect;
  • 从NSValue对象取出之前包装的结构体
- (NSPoint)pointValue;
- (NSSize)sizeValue;
- (NSRect)rectValue;

3.任意数据的包装

  • NSValue提供了下列方法来包装任意数据
+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
+ value参数 : 所包装数据的地址
+ type参数 : 用来描述这个数据类型的字符串, 用@encode指令来生成

- 从NSValue中取出所包装的数据
- (void)getValue:(void *)value;

 

 

//  main.m
//  NSValue


#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {

    /*
    typedef struct{
        int age;
        char *name;
        double _height;
    }Person;
    
    Person p = {30, "lnj", 1.75};
//    NSArray *arr = @[p];
     */
    
    // 1.利用NSValue包装常用的结构体
    /*
    CGPoint point = NSMakePoint(10, 20);
    NSValue *value = [NSValue valueWithPoint:point];
    NSArray *arr = @[value];
    NSLog(@"%@", arr);
     */
    
    // 2.利用NSValue包装自定义的结构体
    typedef struct{
        int age;
        char *name;
        double height;
    }Person;
    
    Person p = {30, "lnj", 1.75};
    // valueWithBytes: 接收一个指针, 需要传递需要包装的结构体的变量的地址
    // objCType: 需要传递需要包装的数据类型
    NSValue *pValue = [NSValue valueWithBytes:&p objCType:@encode(Person)];
    NSArray *arr = @[pValue];
    NSLog(@"%@", arr);
    // 从NSValue中取出自定义的结构体变量
    Person res;
    [pValue getValue:&res];
    NSLog(@"age = %i, name = %s, height = %f", res.age, res.name, res.height);
    
    return 0;
}

 

posted @ 2017-03-30 19:00  iFat  阅读(159)  评论(0编辑  收藏  举报