[英]Objective-C - readonly properties not synthesized with underscore ivar?
[英]Objective C synthesized variable underscore prefix not working
我正在閱讀官方Apple網站上關於在Apple合成屬性的教程。 這是一段摘錄:
除非另行指定,否則合成的實例變量與屬性具有相同的名稱,但帶有下划線前綴。 例如,對於名為firstName的屬性,合成的實例變量將被稱為_firstName 。
但是,后來它說:
重要提示:如果使用@synthesize而未指定實例變量名,則如下所示: @synthesize firstName ; 實例變量將與屬性具有相同的名稱。 在此示例中,實例變量也將被稱為
firstName
,不帶下划線。
這些陳述似乎存在分歧。 當我使用synthesize
like synthesize numerator
_numerator
,然后嘗試使用_numerator
,它顯示以下錯誤: 使用未聲明的標識符_numerator 。
知道我做錯了什么嗎?
您可以在@interface中聲明實例變量和屬性。
在實現中,您可以使用
@synthesize property = instancevariable;
當您這樣做時,編譯器會創建一個名為“instancevariable”的實例變量(如果它尚不存在),並根據需要為setter和getter生成代碼。 變量名稱是您要使用的任何名稱。
@synthesize property;
就其本身而言
@synthesize property = property;
這意味着創建的實例變量與該屬性具有相同的名稱(如果它尚不存在)。 是否從下划線開始創建實例變量並不重要。 該實例變量只是一個實例變量,可能會導致代碼嚴重混淆。
// No synthesize statement
與...完全相同
@synthesize property = _property;
這意味着如果實例變量尚不存在,則使用前導下划線創建實例變量。 是否自己創建了一個沒有下划線的實例變量並不重要。 該實例變量只是一個實例變量,可能會導致代碼嚴重混淆。 在這種情況下,編譯器將發出警告。
有一個例外:如果你自己實現了所有必需的方法(setter和getter,或只是getonly的getter),並且你沒有使用@synthesize,那么就不會創建任何實例變量。 如果使用@synthesize,將如上所述創建實例變量。
因此,最好的選擇就是聲明@property而不是其他內容; 將創建以下划線開頭的實例變量。 如果同時實現setter和getter,或者只實現readonly屬性的getter,則可能不需要實例變量。 如果需要,可以聲明實例變量或使用@synthesize創建它。
如果我不使用synthesize,並且不為變量聲明setter和getter,它們將如何被訪問?
最新版本的Objective-C使@synthesize
成為屬性的默認值,因此您無需顯式編寫@synthesize firstName;
- 編譯器會為您處理。
正如@TimReddy在評論中指出的那樣,你引用的兩個段落之間的區別在於,當你明確地使用@synthesize
指令時,一個人正在討論行為(ivar與屬性的名稱相同),而另一個描述了行為當編譯器自動合成ivar時(ivar名稱是帶有下划線前綴的屬性名稱)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.