Objective-C 接口 - 声明变量和只声明属性有何不同?

7
在Obj-c中,在@interface中声明变量时,

@interface: NSObject{ MyObject* myObject}

@property (unsafe, nonatomic) MyObject* myObject;

相比之下,只将其声明为属性。

@interface: NSObject{}

@property (unsafe, nonatomic) MyObject* myObject; @end

这里不声明任何变量吗?
祝好 Christian
2个回答

10

@property定义了一个接口而不是实现。在你的情况下,你正在定义一个读写属性。这意味着你承诺要实现-myObject-setMyObject:。这与ivar无关。

现在,在大多数情况下,实现这些方法最常见的方式是通过将它们支持为ivar。作为一种方便,ObjC可以使用@synthesize myObject=myObject_;自动生成带有ivar存储的所需方法。这意味着“使用名为myObject_的自动生成ivar创建属性myObject的必需方法。” iVar myObject_是一个真正的ivar,并且您可以正常访问它(尽管通常不应该这样做; 应该使用访问器)。

您可以不使用@synthesize,而是实现-myObject-setMyObject:。您甚至可以使用@dynamic myObject;告诉编译器“不用担心此属性的实现;它将在运行时正确处理。”

@property和仅声明方法之间存在一些差异,但原则上,以下代码行:

@property (nonatomic, readwrite, strong) MyObject* myObject;

在概念上与这个相同:

- (MyObject *)myObject;
- (void)setMyObject:(MyObject *)anObject;

在这里自己声明实例变量并没有真正的影响。你仍然需要以某种方式实现方法。如果你命名的实例变量与@synthesize使用的实例变量相同,那么@synthesize就不会创建新的实例变量。

作为一种实践方法,我不鼓励人们再声明实例变量了。我建议只使用公共和私有属性,并使用@synthesize来创建任何需要的实例变量。如果你出于某些原因必须手动声明实例变量,那么我建议在@implementation块中声明它们而不是在@interface中声明。


9

不声明ivar也是可以的,但是在Xcode IDE中无法查看ivar的值。未来苹果可能会修复这个问题。

您可以使用GDB或lldb来"po" ivar以进行检查。


+1,最近我一直在怒斥调试器,没有想到声明实例变量会使我的内容对调试器可见! - Alan Moore
请向苹果公司提交错误报告:bugreport.apple.com - zaph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接