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

Chr*_* G. 7 iphone objective-c

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

@interface:NSObject {MyObject*myObject}

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

比.仅将其声明为属性

@interface:NSObject {}

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

这里没有申报任何变量?

关心基督徒

Rob*_*ier 10

@property定义接口,而不是实现.在您的情况下,您正在定义一个readwrite属性.这意味着你承诺实施-myObject-setMyObject:.这与ivars无关.

现在,实现这些方法的最常用方法是让它们由ivar支持.为方便起见,ObjC允许您使用ivar存储自动生成所需的方法.@synthesize myObject=myObject_;这说" myObject使用自动创建的ivar 为所有属性创建所需的方法myObject_".ivar myObject_是一个真正的ivar,你可以正常访问它(虽然你通常不应该;你应该使用访问器).

而不是使用@synthesize,你可以只实现-myObject-setMyObject:.您甚至可以@dynamic myObject;用来告诉编译器"不要担心这个属性的实现;它将在运行时正确处理."

@property声明方法和声明方法之间存在一些差异,但原则上,这一行:

@property (nonatomic, readwrite, strong) MyObject* myObject;
Run Code Online (Sandbox Code Playgroud)

在概念上与此相同:

- (MyObject *)myObject;
- (void)setMyObject:(MyObject *)anObject;
Run Code Online (Sandbox Code Playgroud)

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

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


zap*_*aph 9

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

您将能够"聚合"ivar以在GDB或lldb中检查它.