iOS 結構體用法淺談

我們先來看一個問題:CGPoint在記憶體中如何分配?CGPoint在OC中是一個結構體,為了提高定址效率,結構體一般採用記憶體對齊的方式分配。

1、結構體每個成員相對於結構體首地址的偏移量都是這個成員大小的整數倍。如果有需要,編譯器會在成員之間填充位元組。

2、結構體的總大小為結構體最寬成員大小的整數倍。

3、對於結構體成員屬性中包含結構體變數的複合型結構體,在確定最寬基本型別成員時,應當包括複合型別成員的子成員。但在確定複合型別成員的偏移位置時則是將複合型別作為整體看待。

我們先來看一段程式碼:

iOS 結構體用法淺談

為什麼直接給view。frame。size和view。frame。origin賦值會報錯?

iOS 結構體用法淺談

誒,這樣寫為什麼不報錯了呢?

我們知道,CGPoint,CGSize,CGRect本質上都是結構體,且CGPoint,CGSize都是CGRect的成員。

iOS 結構體用法淺談

自定義一個結構體Brithday:

iOS 結構體用法淺談

但是如果我們對結構體變數br再次賦值時,編譯器報錯了,為什麼?

iOS 結構體用法淺談

編譯器報錯是因為語法問題,定義結構體與定義C中的陣列的寫法是一樣的,所以直接把一個大括號賦值給一個變數,系統不能識別出這是一個數組賦值操作還是一個結構體賦值操作,所以我們需要強轉一下。

iOS 結構體用法淺談

除了強制型別轉換,我們還可以怎麼做才會達到二次修改結構體變數的值,還能使編譯器不報錯呢?

iOS 結構體用法淺談

對了,我們可以再建立一個Brithday型別的結構體變數,初始化為我們想要的值,再把該結構體變數賦值給結構體變數br,這樣就達到了二次修改br的效果。當然了我們也可以對單個成員屬性的值進行修改,直接使用點語法來進行修改即可。

接下來我們來說說屬性型別為結構體型別:

iOS 結構體用法淺談

Student。m

iOS 結構體用法淺談