声明的属性是否需要相应的实例变量?

ind*_*gie 102 objective-c instance-variables declared-property

Objective-C 2.0中的属性是否需要声明相应的实例变量?例如,我习惯做这样的事情:

MyObject.h

@interface MyObject : NSObject {
NSString *name;
}
@property (nonatomic, retain) NSString *name;
@end
Run Code Online (Sandbox Code Playgroud)

MyObject.m

@implementation
@synthesize name;
@end
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做了:

MyObject.h

@interface MyObject : NSObject {
}
@property (nonatomic, retain) NSString *name;
@end
Run Code Online (Sandbox Code Playgroud)

这仍然有效吗?它与我之前的例子有什么不同吗?

jbr*_*nan 94

如果您使用的是现代的Objective-C运行时(这是无论是iOS版3.x或更高,或64位雪豹或更高),那么你就不会需要在这样的情况下,以高德定义为您的属性.

当你@synthesize的财产,伊娃实际上也将为你合成.这绕过了"脆弱的伊娃"情景.你可以在Cocoa with Love上阅读更多相关信息


小智 71

在您的界面中,您可以在大括号之间或通过@property大括号外部或两者正式声明实例变量.无论哪种方式,它们都成为班级的属性.不同之处在于,如果您声明@property,那么您可以实现使用@synthesize,它会为您自动编码您的getter/setter.例如,自动编码器设置器将整数和浮点数初始化为零.如果你声明一个实例变量,并且没有指定相应的@property,那么你就不能使用@synthesize而且必须编写自己的getter/setter.

您始终可以通过指定自己的getter/setter来覆盖自动编码的getter/setter.这通常managedObjectContext是由懒惰加载的属性完成的.因此,您将自己声明managedObjectContext为属性,然后再编写-(NSManagedObjectContext *)managedObjectContext方法.回想一下,与实例变量/属性同名的方法是"getter"方法.

@property声明方法还允许你其他的选项,如retainreadonly,该实例变量声明方法没有.基本上,这ivar是旧的方式,并@property扩展它,使它更漂亮/更容易.你可以参考使用自我.前缀或不是,只要名称对该类是唯一的,它就没有关系.否则,如果您的超类具有与您相同的属性名称,那么您必须说出self.name或super.name,以指定您正在谈论的名称.

因此,您会看到越来越少的人ivar在大括号之间声明,而是转向指定@property,然后执行@synthesize.@synthesize没有相应的,你不能在你的实现中做@property.Synthesizer只知道@property规范中的属性类型.synthesize语句还允许您重命名属性,以便您可以在代码中通过一个名称(简写)引用属性,但在.h文件外部使用全名.然而,由于XCode现在具有非常酷的自动完成功能,这不是一个优势,但仍然存在.

希望这有助于消除所有混乱和错误信息.

  • @PapaSmurf这是不正确的.您可以使用`@ property`,而不是**使用`@ synthesize`而不是自己实现它们.编译器将为您自动"合理化",而不必再编写它. (2认同)

小智 8

它可以双向工作,但如果你不在花括号中声明它们,你将不会在xcode中的调试器中看到它们的值.