相比之下,只将其声明为属性。@interface: NSObject{ MyObject* myObject}
@property (unsafe, nonatomic) MyObject* myObject;
这里不声明任何变量吗?@interface: NSObject{}
@property (unsafe, nonatomic) MyObject* myObject; @end
祝好 Christian
相比之下,只将其声明为属性。@interface: NSObject{ MyObject* myObject}
@property (unsafe, nonatomic) MyObject* myObject;
这里不声明任何变量吗?@interface: NSObject{}
@property (unsafe, nonatomic) MyObject* myObject; @end
@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
中声明。
不声明ivar也是可以的,但是在Xcode IDE中无法查看ivar的值。未来苹果可能会修复这个问题。
您可以使用GDB或lldb来"po" ivar以进行检查。