[英]In Objective-C, do we have to use self.var or just var to reference a property of self?
如果我向ViewController添加屬性
@property (strong, atomic) UIView *smallBox;
並且在.m
文件中合成它,該變量實際上只能由任何實例方法中的smallBox
引用。
但是,即使view
被定義為UIViewController的屬性, self.view
也不能被view
替換。 為什么差異和規則是什么?
self.view
和view
/ _view
是不一樣的東西。 根據您創建實例變量的方式, view
或_view
引用實際的對象實例變量。 直接訪問它是危險的,你應該只在init
, dealloc
或訪問器中這樣做。 在其他地方,你應該使用self.view
。
self.view
與[self view]
完全相同,它將消息“view”傳遞給對象“self”並返回結果。 默認情況下,當對象收到消息時,它會使用該名稱執行方法,而view
的默認實現將返回相關實例變量的值( view
或_view
)。
在舊版本的Xcode中,@ @synthesize view
將創建一個名為view
的實例變量。 在最新版本的Xcode中,聲明屬性view
將在很多情況下自動創建一個名為_view
的實例變量,即使沒有@synthesize
。 此更改使您在直接訪問ivar時更容易注意到。
簡而言之:
init
, dealloc
和view
訪問器(如果你自定義編寫它們),總是使用self.view
。 _view
。 @synthesize
。 如果您正在編寫稍微舊的Xcode,請使用@synthesize view=_view;
self.view
並不意味着“實例變量的值”。 它表示“傳遞消息'視圖'的結果”,通常實現為返回實例變量。 您無法直接訪問view
成員,因為它在UIViewController
聲明為@package
可見性。 這可以防止您的代碼訪問它。 (通常,您不希望直接訪問超類的實例變量。)
對於類的屬性,可以直接訪問實例變量,但需要了解內存管理的含義。 (同樣,正如羅布所指出的那樣,正如任何其他行為一樣,你通過避開訪問器來踩踏。)
Apple定義的屬性通常在其名稱前包含下划線,因此當您使用self.view
,它實際上是從對象獲取實例變量_view
。 您不能在代碼中使用_view
,因為它會在編譯時導致鏈接器錯誤,但Xcode仍會為您突出顯示它。 訪問self.view
的實例變量的另一種方法是通過self->_view
,但同樣會導致鏈接器錯誤。 這些鏈接器錯誤的原因是因為編譯的庫不包含_view
的符號; 即使它的聲明可以在UIViewController.h
找到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.