IOS 结构体与位域
2021-01-28 本文已影响0人
wpf_register
结构体
定义
// 结构体类型名 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,而不是字节
**位域是从低位向最高位分配内存的