[英]Objective-C: Understanding Properties
因此,這就是我對Objective-C屬性的了解。 如果這些不是事實,請糾正我。
我對屬性的所有知識都與實例變量結合在一起。 我最近看了一些視頻,說除了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.