簡體   English   中英

NSObject代碼下面是否多余?

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

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