不要声明的属性需要一个相应的实例变量?不要声明的属性需要一个相应的实例变量?(Do declared

2019-05-10 12:44发布

不要在Objective-C 2.0属性需要被宣布相应的实例变量? 例如,我已经习惯了做这样的事情:

MyObject.h

@interface MyObject : NSObject {
NSString *name;
}
@property (nonatomic, retain) NSString *name;
@end

MyObject.m

@implementation
@synthesize name;
@end

但是,如果我这样做,而不是:

MyObject.h

@interface MyObject : NSObject {
}
@property (nonatomic, retain) NSString *name;
@end

这是否仍然有效? 而且是它给我的前面的例子不同的什么办法?

Answer 1:

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

当您@synthesize物业,伊娃将在效果也合成了你。 这得到围绕“脆弱 - 伊娃”的情景。 你可以阅读更多关于它与爱可可



Answer 2:

在你的界面,就可以正式宣布实例变量的括号之间,或者通过@property大括号,或两者之外。 无论哪种方式,它们成为类的属性。 所不同的是,如果你申报@property ,那么你就可以实现使用@synthesize ,其中自动编码您的的getter / setter。 自动编码器二传手初始化整形和浮点零,例如。 如果您声明一个实例变量,并没有指定相应的@property ,那么你就不能使用@synthesize的, 必须写自己的getter / setter。

你总是可以指定自己的覆盖自动编码的getter / setter。 这通常用做managedObjectContext这是松散加载的属性。 因此,你申报你的managedObjectContext作为一个属性,但后来也写了-(NSManagedObjectContext *)managedObjectContext方法。 回想一下,一种方法,其具有相同的名称作为一个实例变量/属性是“吸气剂”的方法。

@property申报方法也可以让你的其他选项,如retainreadonly ,该实例变量声明方法没有。 基本上, ivar是老样子,和@property扩展它,使得它票友/容易。 你可以参考或者使用自我。 前缀,或者没有,它不只要名字是唯一的那类事。 否则,如果你超有一个属性,你同名,那么你不得不说,为了要么喜欢self.name或super.name指定哪个名字,你在说什么。

因此,你会看到越来越少的人宣布ivar括号之间S,而是只对指定转移@property ,然后做@synthesize 。 你不能做@synthesize在您的实现没有相应@property 。 合成只知道是从什么类型的属性@property规范。 该合成语句还允许您重命名的属性,让你可以在你的代码中引用一个属性由一个名称(简写),但在外面的.h文件中使用的全名。 然而,随着很酷自动完成该XCode中现在有,这是更小的优势,但仍然存在。

希望这有助于清除了所有的混乱和被漂浮在那里误传。



Answer 3:

这两种方式都可以,但如果你不花括号中声明它们,你将不会看到在Xcode调试器的值。



Answer 4:

从文档:

在一般性质的行为是既现代又传统的运行时间相同(见的Objective-C运行时编程指南中的“运行时版本和平台”)。 有一个关键的区别:现代运行时支持实例变量的合成,而传统的运行时不。

对于@synthesize在传统的运行工作,则必须提供具有相同名称的属性的实例变量和兼容型或指定的@synthesize声明另一个现有的实例变量。 随着现代运行时,如果你不提供实例变量,编译器增加了一个给你。



Answer 5:

如果您使用的XCode 4.4或更高版本会为您生成实例变量合成代码。

你只需要像下面声明属性; 它将生成合成代码和实例变量声明代码你。

@property (nonatomic, strong) NSString *name;

它将生成合成代码

@synthesize name = _name;

您可以使用_name这是一个类似声明访问实例变量

NSString* _name

但如果声明只读属性什么样子

@property (nonatomic, strong, readonly) NSString *name;

它会生成代码

@synthesize name;

要么

@synthesize name = name; 

所以,你应该用了前缀“_”任何方式,您可以编写自己的代码合成然后编译器将生成代码为您即时访问变量名。 你可以写

@synthesize name = _name;


Answer 6:

在Objective-C编程语言:房产执行指令

有在访问合成依赖于运行时(见“运行时差”)的行为差异:

  • 对于传统运行时,实例变量必须已经在当前类的@interface块中声明。 如果相同名字的实例变量作为属性存在,如果它的类型与属性的类型兼容,它是用来 - 否则,你得到一个编译错误。

  • 对于现代的运行时(见的Objective-C运行时编程指南中的“运行时版本和平台”),根据需要实例变量进行合成。 如果相同名字的实例变量已经存在,它被使用。



文章来源: Do declared properties require a corresponding instance variable?