下面的NSObject代码是多余的吗?

时间:2015-08-18 18:45:42

标签: ios objective-c nsobject nscoding

我在这里关注教程: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'

所以我的Qustion是if(在下面的代码中)我删除括号之间的代码会丢失一些重要的东西吗?

 @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

3 个答案:

答案 0 :(得分:4)

您不应该明确声明ivars,因为属性会自动合成他们自己的ivars,名称略有不同。明确的ivars是没有意义的,并且不会被属性使用。当你想要设置一个房产时,如果你错误地使用了你的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

答案 1 :(得分:0)

您将丢失实例变量,但您并不真正想要它们,因为属性会为您创建它们(名称略有不同)并且访问这些(隐藏的)类型更安全通过属性访问器方法生成的实例变量。

答案 2 :(得分:0)

是的,而且你可能会得到一些你不想要的东西。

如果您没有标识符 identifier 的实例变量,也没有标识符 _identifier 的实例变量,则手动合成和自动合成将使用名称​​ _identifier 创建一个。

如果您已经有一个标识为 _identifier 的实例变量,则手动合成和自动合成将使用它。 (因此在大多数情况下,声明这样的实例变量是没有意义的。)

但是如果你有一个带有标识符 identifier 的实例变量(没有下划线),手动合成将使用它,而自动合成将不会使用它,而是创建一个新的标识符 _identifier 。因此,您有两个实例变量 identifier _identifier 。通常你不想要这个。