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声明方法还允许你其他的选项,如retain和readonly,该实例变量声明方法没有.基本上,这ivar是旧的方式,并@property扩展它,使它更漂亮/更容易.你可以参考使用自我.前缀或不是,只要名称对该类是唯一的,它就没有关系.否则,如果您的超类具有与您相同的属性名称,那么您必须说出self.name或super.name,以指定您正在谈论的名称.
因此,您会看到越来越少的人ivar在大括号之间声明,而是转向指定@property,然后执行@synthesize.@synthesize没有相应的,你不能在你的实现中做@property.Synthesizer只知道@property规范中的属性类型.synthesize语句还允许您重命名属性,以便您可以在代码中通过一个名称(简写)引用属性,但在.h文件外部使用全名.然而,由于XCode现在具有非常酷的自动完成功能,这不是一个优势,但仍然存在.
希望这有助于消除所有混乱和错误信息.
| 归档时间: |
|
| 查看次数: |
28596 次 |
| 最近记录: |