我们先来看一个问题:CGPoint在内存中如何分配?CGPoint在OC中是一个结构体,为了提高寻址效率,结构体一般采用内存对齐的方式分配。
1、结构体每个成员相对于结构体首地址的偏移量都是这个成员大小的整数倍。如果有需要,编译器会在成员之间填充字节。
2、结构体的总大小为结构体最宽成员大小的整数倍。
3、对于结构体成员属性中包含结构体变量的复合型结构体,在确定最宽基本类型成员时,应当包括复合类型成员的子成员。但在确定复合类型成员的偏移位置时则是将复合类型作为整体看待。
我们先来看一段代码:
为什么直接给view.和view.赋值会报错?
诶,这样写为什么不报错了呢?
我们知道,CGPoint,CGSize,CGRect本质上都是结构体,且CGPoint,CGSize都是CGRect的成员。
自定义一个结构体Brithday:
但是如果我们对结构体变量br再次赋值时,编译器报错了,为什么?
编译器报错是因为语法问题,定义结构体与定义C中的数组的写法是一样的,所以直接把一个大括号赋值给一个变量,系统不能识别出这是一个数组赋值操作还是一个结构体赋值操作,所以我们需要强转一下。
除了强制类型转换,我们还可以怎么做才会达到二次修改结构体变量的值,还能使编译器不报错呢?
对了,我们可以再创建一个Brithday类型的结构体变量,初始化为我们想要的值,再把该结构体变量赋值给结构体变量br,这样就达到了二次修改br的效果。当然了我们也可以对单个成员属性的值进行修改,直接使用点语法来进行修改即可。
接下来我们来说说属性类型为结构体类型:
S