A.您也可以在实现中添加 ivars:
@implementation AClass
{
id ivar;
}
因此不同之处不在于 ivars 必须在标头(接口)中。 (但见下文 B.)
B.如果不应在外部使用 ivar,则没有理由将其放在公共标头中。如果某人无法使用 ivar,您为什么要告知某人有关 ivar 的信息?这是源代码垃圾邮件。
C.属性添加(或使用)一个 ivar。此外,它还添加了访问器方法。
D.属性提供额外的语义信息,尤其是关于原子性和 setter 语义的,如果它在标头中声明的话。
到目前为止,应该清楚的是,属性通常是建模对象状态的更好方法。那么为什么我们在标头中有 ivars 呢?
这是为了遗产。以前我们没有声明属性。在标头中有 ivars 有一些原因(例如,告诉编译器对象大小),但这已经消失了。现在在标头中声明 ivars 的唯一含义是您将它们公开并让其他人出于性能原因直接访问它们。您应该有很好的性能理由这样做。我从来没有吃过。
除了杰夫的回答:
如果您想让 ivars 对子类公开,您可以将它们放入额外文件中的类延续中。举个例子:
MyClass.h
// We do not put ivars in the public header. This is an implementation detail.
@interface MyClass : NSObject
…
@end
MyClass_SubclassAddition
// We do put ivars in an extra header with a class continuation, to make them visible for subclasses
@interface MyClass()
{
id ivar;
}
@end
MyClass.m 或 MySubclass.m
// We use both headers in the implementation and subclass implementation:
#import "MyClass.h"
#import "MyClass_SubclassAddition.h
@implementation MyClass
…
@end
如果您在初始化程序中使用 setter,您可以摆脱“子类 ivar 问题”。这样做是否错误,是一个不同的讨论。我个人更喜欢使用二传手。但是不要让我们再次开始讨论(一次又一次……)