objective-c interface - 声明变量vs只是属性?

时间:2012-01-30 14:31:36

标签: iphone objective-c

在Obj-c中声明@interface

中的变量时
  

@interface:NSObject {   MyObject * myObject}

     

@property(不安全,非原子)MyObject * myObject;

Vs以上。仅将其声明为属性

  

@interface:NSObject {}

     

@property(不安全,非原子)MyObject * myObject;   @end

这里没有声明任何变量?

此致 基督教

2 个答案:

答案 0 :(得分:10)

@property定义了一个接口,而不是一个实现。在您的情况下,您正在定义一个readwrite属性。这意味着您承诺实施-myObject-setMyObject:。这与伊娃没有任何关系。

现在,实现这些方法的最常用方法是让它们由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;

自己宣布ivar在这里没有真正的影响。你仍然需要以某种方式实现这些方法。如果您指定的ivar与ivar @synthesize正在使用的相同,那么@synthesize就不会创建新的ivar。

作为一种惯例,我不鼓励人们再宣布伊娃。我建议只使用@synthesize的公共和私有属性来创建任何所需的ivars。如果您出于某种原因必须拥有手动ivar,那么我建议您在@implementation块而不是@interface中声明它们。

答案 1 :(得分:9)

跳过声明ivar非常好 - 但是你将无法在Xcode IDE中看到ivar的值。有一天,苹果可以解决这个问题。

你将能够“聚合”伊娃在GDB或lldb中进行检查。