1. 程式人生 > >iOS 面試題(1):一個 Objective-C 物件的記憶體結構是怎樣的?

iOS 面試題(1):一個 Objective-C 物件的記憶體結構是怎樣的?

接下來分享的將會是唐老師一系列的iOS面試題,因為之前好幾期唐老師都刪掉了,說是要出書,所以轉載過來,需要的朋友們可以看下,也方便我自己鞏固、學習。

轉載自:http://mp.weixin.qq.com/s?__biz=MjM5NTIyNTUyMQ==&mid=2709545297&idx=1&sn=a391cf9771ed34a211d4d91724bdbaec&chksm=828f0b8fb5f88299f42bde095fb323fe9ed5fa082b19a451535f069b1db550366a35d6c5e8f7&mpshare=1&scene=1&srcid=0221JIeBGylsHuaG1lwvh5Wn#rd

問題

一個 Objective-C 物件的記憶體結構是怎樣的?

答案

這是一道老題,或許很多人都準備過,其實如果不是被每個公司都考查的話,這道題可以看看候選人對於 iOS 背後底層原理的感興趣程度。真正對程式設計感興趣的同學,都會對這個多少有一些好奇,進而在網上搜索並學習這方面的資料。

以下是本題的簡單回答:

如果把類的例項看成一個C語言的結構體(struct),它首先包含的是一個 isa 指標,而類的其它成員變數依次排列在結構體中。排列順序如下圖所示:


為了驗證該說法,我們在Xcode中新建一個工程,在main.m中執行如下程式碼:

#import <UIKit/UIKit.h>

@interface Father : NSObject {    
    int _father;
}
@
[email protected]
Father @end @interface Child : Father { int _child; } @end @implementation Child @end int main(int argc, char * argv[]) { Child * child = [[Child alloc] init]; @autoreleasepool { // ... } }

我們將斷點下在 @autoreleasepool 處,然後在Console中輸入p *child,則可以看到Xcode輸出如下內容,這與我們上面的說法一致。

(lldb) p *child
(Child) $0 = {
  (Father) Father = {
    (NSObject) NSObject = {
      (Class) isa = Child
    }
    (int) _father = 0
  }
  (int) _child = 0
}
因為物件在記憶體中的排布可以看成一個結構體,該結構體的大小並不能動態變化。所以無法在執行時動態給物件增加成員變數。

注:需要特別說明一下,通過 objc_setAssociatedObject 和 objc_getAssociatedObject方法可以變相地給物件增加成員變數,但由於實現機制不一樣,所以並不是真正改變了物件的記憶體結構。

相關推薦

iOS 試題1一個 Objective-C 物件記憶體結構是怎樣的?

接下來分享的將會是唐老師一系列的iOS面試題,因為之前好幾期唐老師都刪掉了,說是要出書,所以轉載過來,需要的朋友們可以看下,也方便我自己鞏固、學習。 轉載自:http://mp.weixin.qq.com/s?__biz=MjM5NTIyNTUyMQ==&mid=

iOS開發簡記1指定APP的圖標與啟動圖

appstore 技術分享 tps http data 對象 暫時 -c 系統 各位兄弟姐妹們,早上好,本人花了將近一個月的時間打造了一個完整的IOS版的App, 期間包括開發,測試,上線審核,現在花點時間把實現的過程分享給大家,“知音”app功能簡單,適合對象為初學者,後

JAVA基礎試題1

1、所有的類都繼承於Object類,其直接子類有Boolean 、void 、Character、Class、Compiler、Math、Number、Runtime、StringBuffer、StringBuilder、System、Thread等等;其常用的方法有:toString()、&nbs

spring試題面向切面程式設計AOP+MVC

Spring面向切面程式設計(AOP) 1.  解釋AOP 面向切面的程式設計,或AOP, 是一種程式設計技術,允許程式模組化橫向切割關注點,或橫切典型的責任劃分,如日誌和事務管理。   2. Aspect 切面 AOP

spring試題註解+資料訪問

Spring註解 1. 什麼是基於Java的Spring註解配置? 給一些註解的例子. 基於Java的配置,允許你在少量的Java註解的幫助下,進行你的大部分Spring配置而非通過XML檔案。 以@Configuration 註解為例,它用來標記類可以當做

試題1順序錶鏈表

1.刪除連結串列中等於給定值 val 的所有節點。 /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *n

常見的試題1

1.談談你對spring的理解? 答:我理解spring:它是一個提供新的管理機制來管理物件和業務,並且可以結合其他元件,降低耦合,提高程式碼複用的輕量級開源框架。 它通過控制控制反轉(ioc),依賴注入(di)機制將物件全部放在spring的IOC容器裡通過spring

經典試題1

將一個字元陣列的內容為:“student a am i”改為“i am a student” 要求: 1. 不能使用庫函式; 2.只能開闢有限個空間(空間個數和字串的長度無關)。 演算法思路:先將字元陣列"student a am i"逆置變為"i ma a

Spark試題1

面試題1:描述一下Spark 在yarn上的工作原理? 答: 客戶端要提交一個yarn的作業,首先要通過Resource manager去分配一個container給node mananger,用來跑application master,然後application m

Java試題1

1.說一下轉發(Forward)和重定向(Redirect)的區別 答:①轉發是伺服器行為,重定向是客戶端行為 ②剩下的區別如下圖: 2. TCP 三次握手和四次揮手 簡單示意圖: 客戶端–傳送帶有 SYN 標誌的資料包–一次握手–服務端 服務端–傳送帶有

iOS開發簡記1指定APP的圖示與啟動圖

各位兄弟姐妹們,早上好,本人花了將近一個月的時間打造了一個完整的IOS版的App, 期間包括開發,測試,上線稽核,現在花點時間把實現的過程分享給大家,“知音”app功能簡單,適合物件為初學者,後面我會把iOS客戶端原始碼、API介面原始碼“呈獻”給大家,謝謝大家的支援, 歡迎園友一起交流一起學習,廢話少說,裝

一些試題1

java中String、StringBuffer、StringBuilder的區別 java中String、StringBuffer、StringBuilder是程式設計中經常使用的字串類,他們之間的區別也是經常在面試中會問到的問題。現在總結一下,看看他們的不同與相同。 1.可變與不可變

我遇到過的 iOS 試題swift

8、UInt8、UInt16、UInt32、UInt64的最大值分別是? 7、寫出比下方更有效率的演算法? var a = 3 for _ in 0..<100 { a = a * 2

試題Java基礎知識

Java 基礎知識01. 面向物件的特性有哪些?答:封裝、繼承和多型。02. Java 中覆蓋和過載是什麼意思?解析:覆蓋和過載是比較重要的基礎知識點,並且容易混淆,所以面試中常見。答:覆蓋(Overr

試題1

1 . 列印結果為: def Extend_List(val,a_list=[]): list.append(val) return list list_1 = Extend_List

java經典試題1

1、 面向物件的特徵有哪些方面 1.抽象: 抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。

試題高併發程式設計

高併發程式設計在 Java 5.0 提供了 java.util.concurrent(簡稱 JUC )包,在此包中增加了在併發程式設計中很常用的實用工具類,用於定義類似於執行緒的自定義子系統,包括執行緒

劍指offer試題賦值運算子函式

對於定義一個賦值運算子函式時,需要注意一下幾點: (1)函式的返回型別必須是一個引用,因為只有返回引用,才可以連續賦值 (2)傳入的引數宣告為常量引用,可以提高程式碼效率,同時賦值運算函式內不會改變傳入的例項狀態 (3)一定要記得釋放例項自身已有的記憶體,否則程式容易出現記

軟體測試經典試題1

1.主鍵、外來鍵的作用,索引的優點與不足? 答:主鍵:是表中的唯一標示鍵。作用:保證實體的完整性;加快資料庫的操作速度;增加新的表記錄時,資料庫會自動檢索新記錄的主鍵值,不允許該值與其他表中記錄的主鍵重複;資料庫會按主鍵值的順序顯示記錄,如果沒有設定主鍵,則按輸入的順序顯示

嵌入式筆試試題1---C++

C++的類的繼承與多型1、是不是一個父類寫了一個virtual 函式,如果子類覆蓋它的函式不加virtual ,也能實現多型? 能2、構造、拷貝構造和賦值運算子的概念3、struct C{C(){cout << "construct: C()" <<