簡體   English   中英

Objective C合成變量下划線前綴不起作用

[英]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.

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