IOS 结构体与位域

参考链接

结构体

定义

// 结构体类型名 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 结构体与位域)