下面的 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
。通常你不需要这个。
我正在按照这里的教程进行操作: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
。通常你不需要这个。