簡體   English   中英

Objective-C:了解屬性

[英]Objective-C: Understanding Properties

因此,這就是我對Objective-C屬性的了解。 如果這些不是事實,請糾正我。

  1. 聲明屬性時,您要聲明實例變量的設置器/獲取器
  2. 如果要定義setter和getter,則需要將它們合成
  3. 如果您進行合成,則會為您定義實例變量。 最佳做法是重命名iVar,以使getter和iVar的名稱不同。 所以您通常這樣做:@synthesize myVar = _myVar

我對屬性的所有知識都與實例變量結合在一起。 我最近看了一些視頻,說除了setters / getters之外,屬性還可以用於其他實例方法。

這是真的? 如果是這樣,您將如何以及為什么使用這種方式? 例如,我正在觀看有關協議的Stanford cs193p視頻,它說您可以在協議中擁有原型。 我可能會誤會。

無論如何要感謝那些回應

聲明屬性時,您要聲明實例變量的設置器/獲取器

不,您是在聲明屬性的獲取器和可能的設置器。 期。 聲明屬性本身並不意味着實例變量。 有許多方法可以實現屬性。 實例變量碰巧是一種常見且流行的方式,但是非ivar屬性非常常見。

如果要定義setter和getter,則需要將它們合成

不。 (正如塞爾吉奧指出,我本來就混淆了“定義”和“聲明”。)幾乎。 @property行本身聲明了setter和getter。 如果您想為您實現 setter和getter,則稱為“ synthesize”,但是您不再需要手動執行此操作。 編譯器將為您聲明但未實現的任何屬性自動創建一個getter和setter方法(除非您明確要求不要使用@dynamic )。

如果您進行合成,則會為您定義實例變量。 最佳做法是重命名iVar,以使getter和iVar的名稱不同。 所以您通常這樣做:@synthesize myVar = _myVar

幾乎。 幾個月前確實如此,但是您實際上不再需要@synthesize 現在,編譯器將自動為您完成此操作。

此標頭:

@interface MyObject : NSObject
@property (nonatomic, readwrite, strong) NSString *something;
@end

與此標題幾乎相同:

@interface MyObject : NSObject
- (NSString *)something;
- (void)setSomething:(NSString *)something;
@end

兩者之間有一些非常小的差異,一些與運行時有關,一些與編譯器有關,但是如果您僅假裝它們是相同的,那就更清楚了。

在這兩種情況下,您要做的只是聲明一些方法。 您沒有宣布如何實現它們。 您不是在聲明ivars。 您只是在聲明方法。 現在,您可以隨意以任何方式實現這些方法。 如果願意,可以通過讓編譯器為您綜合一些默認實現來實現它們。 如果您願意,可以手動實施它們。 您可以根據需要選擇其中一項。

從Xcode 4.4開始,默認情況下會合成屬性。 因此,您只需要聲明屬性(myVar)。 您還將可以使用_myVar代替訪問self.myVar。

使用屬性作為無參數方法會將它們扭曲成某種不是它們的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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