zoukankan      html  css  js  c++  java
  • NSValue 保存定长的结构体

    假设有如下C语言结构体:
    struct Tekuba_Net 
    {   unsigned char value1;
        float value2;
        int value3;
    };
    tekuba_Net结构存放在NSMutableArray类型tekubaArray数组中代码清单如下:
    struct Tekuba_Net tekuba_Net;
    tekuba_Net.value1='1';
    tekuba_Net.value2=2.0;
    tekuba_Net.value3=2;
    //将struct对象装入到NSArray中
    [tekubaArray addObject:[NSValue value:&tekuba_Net withObjCType:@encode(struct Tekuba_Net)]];
    从tekubaArray数组中恢复Tekuba_Net元素的代码清单如下:
    struct Tekuba_Net tekuba_Net;
    [[tekubaArray objectAtIndex:0] getValue:&tekuba_Net];
    分析:
    1,NSValue类型
    NSValue是用来存储一个C/C++或者Objective-C数据的容器类。它可以保存任意类型的数据,比如C/C++标准的int,float,char等,当然也可以是指针,结构,以及Object-C的对象。NSValue类的目标就是允许以上数据类型的数据结构能够被添加到集合里。
    2,使用NSValue需要注意的问题
    你不可以存储C字符串,不定长数组/结构和其他的一些不定长的数据类型到NSValue中.
    你应该使用NSString或者NSData来存储此类不定长数据。当然你可以把一个指向变长对象的指针存储在NSValue对象中。
    如果你的数据不是定长的会发生什么?请看如下结构:
    typedef _Tekuba_Net 
    {
    int dataSize;
    char *data;
    }Tekuba_Net;
    当data指向一个字符数组时,它是变长的,所以它指向的数据不会被编码,只有这个指针地址被编码了。所以不要期望它能存储你的data。你应该使用NSData或者NSArchiver来代替NSValue以达到期望目的。
    再看下面例子:
    typedef struct1 {
    int month;
    int day;
    } Tekuba_Net;
    typedef struct2 {
    int dataSize;
    Tekuba_Net *tekuba_Net;
    } myTekuba_net;
    Tekuba_Net是一个定长的类型变量,Tekuba_Net能被NSValue正确编码.而myTekuba_net中包含有指针就不能被NSVaule编码,在这种情况下,需要使用NSData。
    总之,使用NSValue存放结构只能存放那些没有指针变量的结构。
    3,NSValue其他的操作
    @interface NSValue (NSValueUIGeometryExtensions)   
    + (NSValue *)valueWithPointer:(const void *)pointer;//保存对象指针   
    + (NSValue *)valueWithCGPoint:(CGPoint)point;//保存CGPoint结构体   
    + (NSValue *)valueWithCGSize:(CGSize)size;//保存CGSize结构体   
    + (NSValue *)valueWithCGRect:(CGRect)rect;//保存CGRect结构体   
    + (NSValue *)valueWithCGAffineTransform:(CGAffineTransform)transform;   
    + (NSValue *)valueWithUIEdgeInsets:(UIEdgeInsets)insets;   
        
    - (void *)pointerValue;   
    - (CGPoint)CGPointValue;   
    - (CGSize)CGSizeValue;   
    - (CGRect)CGRectValue;   
    - (CGAffineTransform)CGAffineTransformValue;   
    - (UIEdgeInsets)UIEdgeInsetsValue;
    @end  

     转:本文地址:http://www.tekuba.net/program/276/

  • 相关阅读:
    微信小程序跳转传参参数丢失?
    微信小程序订阅消息,我踩过的坑都在这里了!
    CSS 了解一下
    简单地认识一下 HTML
    我和前端的猿粪,了解一下我眼中的前端。
    微信小程序如何发送订阅消息,正确姿势来了,建议收藏!
    微信小程序新服务消息推送 —— 订阅消息
    微信小程序 wxml 文件中如何让多余文本省略号显示?
    如何制作国旗头像,微信小程序利用 canvas 绘制挂件头像
    Vue组件中的Data为什么是函数。
  • 原文地址:https://www.cnblogs.com/li-baibo/p/3185629.html
Copyright © 2011-2022 走看看