關於 Objective-C iVar 的一點說明

來源:互聯網
上載者:User

Class A:

@interface ClassA : NSObject{
}
@property(nonatomic, retain) Foo* foo;
@end

 

Class B:

 

@interface ClassB : NSObject{
Foo* foo;
}
@property(nonatomic, retain) Foo* foo;
@end

 

上面兩個類的不同是:第二個類包含一個名字為"foo"的 ivar。

如果在類的實現部分包含了"@synthesize foo;",並且用了比較新的編譯器(好像是從 4.2 開始的),對於第一個類,編譯器會自動為類添加一個合適的ivar,

你可以直接用foo,就像定義了foo這個成員變數一樣。

ivar 的 synthesis 機制依賴於 Objective-C 的“修複脆弱基類的特性”。

在大部分編譯型語言中,ivar 的訪問是通過“對象地址 + ivar 位移量”的方式,

子類中的 ivar 需要在基類 ivar 的後面,這樣子類必須知道基類對象的大小才可以計算出自身 ivar 的開始地址。

當改變基類的大小時,比如增加或者減少 ivar,就必須重新編譯所有子類。

Objective-C 解決“脆弱基類”的方式是:將所有 ivar 的大小作為一項中繼資料,儲存到類的元資訊中,並且在運行時進行設定。

這樣可以通過“對象地址+基類大小+ivar位移量”的方式來計算相應的ivar 地址,並訪問對應的ivar。

關於“ivar synthesis”的底層機制依賴於編譯器,總之編譯器會調整 ivar 地區,以達到動態添加 ivar 的目的。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.