簡體   English   中英

在Objective-C中,我們是否必須使用self.var或var來引用self的屬性?

[英]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.viewview / _view是不一樣的東西。 根據您創建實例變量的方式, view_view引用實際的對象實例變量。 直接訪問它是危險的,你應該只在initdealloc或訪問器中這樣做。 在其他地方,你應該使用self.view

self.view[self view]完全相同,它將消息“view”傳遞給對象“self”並返回結果。 默認情況下,當對象收到消息時,它會使用該名稱執行方法,而view的默認實現將返回相關實例變量的值( view_view )。

在舊版本的Xcode中,@ @synthesize view將創建一個名為view的實例變量。 在最新版本的Xcode中,聲明屬性view將在很多情況下自動創建一個名為_view的實例變量,即使沒有@synthesize 此更改使您在直接訪問ivar時更容易注意到。

簡而言之:

  • 除了initdeallocview訪問器(如果你自定義編寫它們),總是使用self.view
  • 在這些方法中,您應該將其稱為_view
  • 如果您正在編寫最新的Xcode,請不要包含@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM