【问题标题】:is there any reason to use a property for an ivar that is only being used internally in a class?是否有任何理由为仅在类内部使用的 ivar 使用属性?
【发布时间】:2011-04-04 19:20:59
【问题描述】:

是否有任何理由为仅在类内部使用的 ivar 使用属性?

我可以看到,在objective-c 中为一个类使用属性有助于其他类访问实例变量,但是对于实例变量的内部使用,是否有任何好处/需要为它使用属性?事实上,对于财产,你必须是“自我”。在它访问它之前似乎,而不仅仅是实例变量的名称。

也许我应该把这个问题分解成:

  • 例如表示 IBOutlet 控件的变量(以防万一)
  • 您可能需要跨类的方法来协助的任何其他实例变量

【问题讨论】:

    标签: iphone objective-c properties


    【解决方案1】:

    当然。如果您需要在-init-dealloc 以外的时间更改此变量的值,则使用@property 意味着您可以让编译器为您处理内存管理。

    【讨论】:

    • 嗨,戴夫 - 不太明白你的意思 - 你仍然需要在我一直假设的 dealloc 方法中释放属性?
    • 我建议在类扩展中添加任何这样的@propertys。
    • @Greg 是的,你仍然需要在-dealloc 中输入-release(像往常一样)。但在内部,您将能够执行[self setFoo:newFoo];,所有释放旧值和保留新值的内存管理都将为您处理。这是非常非常非常有用的。 @Richard 将声明放在类扩展中的建议非常棒。
    • +1(如果可以的话,+10)。封装内存管理至关重要。另一种方法是将它分散在整个代码中,这使得当(而不是如果)您忘记某处所需的保留或释放时进行调试是一场噩梦。不过,@property 和点语法的使用有些偶然;在这里至关重要的是 setter 方法的使用,而不是创建它们的方法。手动设置方法在封装方面也有同样的好处。
    • @Greg 如果您不使用self.,那么您只是直接访问 ivar,这完全绕过了属性设置器。如果您愿意,可以使用 [self setFoo:newFoo]; 而不是 self.foo = newFoo;
    【解决方案2】:

    我通常不使用界面生成器,但我认为您总是需要 IBOutlets 的属性。我刚刚回答了一个人的问题,因为他没有访问权限。你可能没有(我不知道),但是内存管理变得更容易了。

    就任何其他实例变量而言,使用属性的唯一原因是使内存管理更容易:

    self.object = newObject;
    

    替换

    [object release];
    object = [newObject retain];
    

    如果您不打算在类之外使用您的属性,您可以在 .m 文件中声明它,就像使用私有方法一样。这样其他类将不知道您的属性的存在。

    【讨论】:

    • object = [newObject retain].
    • ... 而 就是访问器如此重要的原因。当我们手写它时,很容易忘记这些东西! :-)
    • @Sherm 我没有意识到,但我证明了一点,不是吗? :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2011-06-09
    • 2018-07-14
    • 2014-07-14
    • 2010-12-31
    • 2019-01-19
    相关资源
    最近更新 更多