[英]Is the NSObject code below redundant?
我在這里關注該教程: http : //blog.soff.es/archiving-objective-c-objects-with-nscoding創建一個NSObject,可以在回合制游戲中保存我的比賽數據。
但是,我在.m文件中收到此警告:
Autosynthesized property 'title' will use synthesized instance variable '_title', not existing instance variable 'title'
所以我的問題是(如果在下面的代碼中)刪除括號之間的代碼,我會失去一些重要的東西嗎?
@interface Note : NSObject <NSCoding> {
NSString *title;
NSString *author;
BOOL published;
}
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *author;
@property (nonatomic) BOOL published;
@end
您不應該顯式聲明ivars,因為屬性將自動合成名稱稍有不同的自己的ivars。 顯式ivars是沒有意義的,不會被屬性使用。 當您打算設置屬性時錯誤使用ivars時,擁有它們只會導致bug。
警告是通過讓您知道會有兩個相似的ivars來指出這一點的。
您的代碼應該只是:
@interface Note : NSObject <NSCoding>
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *author;
@property (nonatomic) BOOL published;
@end
這樣可以避免以下錯誤:
title = @"Some Title"; // sets your ivar, not the property
相對於:
_title = @"Some Title"; // directly sets the property's ivar
當然,您應該使用該屬性:
self.title = @"Some Title"; // uses the property methods
您可能會丟失實例變量,但實際上並不需要它們,因為屬性會為您創建它們(名稱略有不同),並且通過屬性訪問器方法訪問這些(某種隱藏的)自動生成的實例變量更加安全。
是的,很可能您得到了不需要的東西。
如果您既沒有標識符identifier
又沒有標識符_identifier
的實例變量,則手動合成和自動合成將創建一個名稱為_identifier
的實例變量。
如果您已經有一個標識符為_identifier
的實例變量,則將使用手動合成和自動合成。 (因此,在大多數情況下,聲明這樣的實例變量是沒有意義的。)
但是,如果您有一個帶有標識符identifier
的實例變量(不帶下划線),則手動合成將使用它,而自動合成將不使用它,而是使用標識符_identifier
創建一個新_identifier
。 因此,您有兩個實例變量identifier
和_identifier
。 通常,您不希望這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.