目标c中公共伊瓦尔与私有财产之间的差异

时间:2015-01-05 09:01:07

标签: objective-c properties ivar

我是否知道 .h 文件中的实例变量与目标c中 .m 文件中的属性有什么区别?

我知道两者都不能在课外使用。还有其他区别吗?

2 个答案:

答案 0 :(得分:1)

一个。您也可以在实现中添加ivars:

@implementation AClass
{
   id ivar;
}

因此,不同之处在于ivars必须位于标题(接口)中。 (但见下文B。)

B中。如果不应在外面使用ivar,则没有理由将其放入公共标题中。如果他不能使用它,你为什么要通知某人一个伊娃?这是源代码垃圾邮件。

℃。属性添加(或使用)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问题"。这是否错误是一个不同的讨论。我个人更喜欢使用setter。但是,不要让我们再次开始讨论(一次又一次......)

答案 1 :(得分:-1)

最大的实际区别是子类可以查看和使用在.h中声明的ivars,如果它们位于实现文件顶部的扩展中,则子类无法访问它们。 我喜欢在.m文件中开始使用它们,但我很乐意将其中一个移到标题中,以便从子类中使用它。