【问题标题】:difference between public ivar and private proprety in objective c目标c中公共ivar和私有财产之间的区别
【发布时间】:2015-01-05 09:01:06
【问题描述】:

我可以知道.h文件中的实例变量和objective c中.m文件中的属性有什么区别吗?

我知道两者都不能在课堂外使用。还有什么不同吗?

【问题讨论】:

  • 请查看How to ask
  • 公共实例变量可以很好地在类外使用(我并不是说应该定义它们)。
  • 您刚刚在 cmets 中向your earlier question 提出了类似的问题。你读到了什么让你决定 .h 不能 中的实例变量在类之外使用,这与你在上一个问题的答案中被告知的相反?提供参考,也许有人可以向您解释。

标签: objective-c properties ivar


【解决方案1】:

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 问题”。这样做是否错误,是一个不同的讨论。我个人更喜欢使用二传手。但是不要让我们再次开始讨论(一次又一次……)

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 你可以通过额外的课程延续获得更好的效果。
    • '到目前为止'是有问题的。你的回答很好,我支持你。但我的并不是不准确,问题是关于差异,而不是最佳实践..
    • 我没有说也不认为你的答案不正确。我没有投反对票。
    猜你喜欢
    • 1970-01-01
    • 2018-05-18
    • 2011-09-18
    • 2017-01-03
    • 2011-12-21
    • 2011-05-25
    • 2011-05-20
    相关资源
    最近更新 更多