下面的 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

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

您不应显式声明 ivar,因为属性会自动合成它们自己的 ivar,名称略有不同。明确的 ivars 是没有意义的,不会被属性使用。当你想设置 属性.

时错误地使用你的 ivars 时,拥有它们只会导致错误

警告通过让您知道将有两个相似的 ivar 来指出这一点。

您的代码应该只是:

 @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[=34= 的实例变量], 手动合成和自动合成将创建一个名称为 _identifier.

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

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