我在这里关注教程: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
答案 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
。通常你不想要这个。