美文网首页
IOS 结构体与位域

IOS 结构体与位域

作者: wpf_register | 来源:发表于2021-01-28 11:25 被阅读0次

    参考链接

    结构体

    定义

    // 结构体类型名 StudentScore
    struct StudentScore {
        int stuNo;
        int stuMath;
        int stuEnglish;
        int stuChinese;
    };
        // 创建stu结构体信息
        struct StudentScore st1 = {1, 98, 96, 87};
        // 结构体值的调用
        NSLog(@"st1:%d,%d,%d,%d",st1.stuNo,st1.stuMath,st1.stuEnglish,st1.stuChinese);
    

    typedef 定义struct

    // 使用typedef来定义结构体
    typedef struct StudentScore2 { // 此处的StudentScore2可以直接删除不写
        int stuNo;
        int stuMath;
        int stuEnglish;
        int stuChinese;
    } studentScore2;
    
        studentScore2 st2 = {2, 95, 88, 98};
        NSLog(@"st2:%d,%d,%d,%d",st2.stuNo,st2.stuMath,st2.stuEnglish,st2.stuChinese);
    

    定义结构体时,如果不涉及到OC中的对象时,可以直接将结构体当作成员变量属性使用。
    但在结构体中定义了OC中的对象,编译会报错,提示“ARC时禁止在结构体中定义OC的对象”,
    主要原因在于ARC无法管理结构体中的OC对象的生命周期以内存。

    ARC在是编译器特性,编译时在合适的位置插入对象的内存管理代码。由于标准的C语言结构体struct没有析构函数,编译器无法在合适的位置插入内存管理代码,从而导致内存泄漏。

    因此在ARC项目中,
    如果没有做特殊处理,
    在结构体中成员变量全部用基本数据类型,
    不能声明OC对象,
    除非明确指出放弃对该对象的内存管理权限,例如将对象定义为 __unsafe_unretain

    位域

    typedef struct {
        unsigned int second: 6;
        unsigned int minute: 6;
        unsigned int hour: 5;
        unsigned int day:5;
        unsigned int month :4;
        unsigned int year: 6;
    }testStruct;
    

    位域的定义形式为:类型说明符号 位域名:位域长度
    **长度单位是bit,而不是字节
    **位域是从低位向最高位分配内存的

    相关文章

      网友评论

          本文标题:IOS 结构体与位域

          本文链接:https://www.haomeiwen.com/subject/ljjttltx.html