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

Iphone 是否有任何理由使用仅在类内部使用的ivar属性?,iphone,objective-c,properties,Iphone,Objective C,Properties,是否有任何理由使用仅在类内部使用的ivar属性 我可以看出,在objective-c中为类使用属性有助于其他类访问实例变量,但是对于实例变量的内部使用,使用属性有什么好处/需要吗?事实上,对于属性,您必须是“self”。在它访问它之前,它似乎是,而不仅仅是实例变量的名称 或许我应该把这个问题分为: 例如,表示IBOutlet控件的变量(如果是特殊的) 在类的方法中可能需要的任何其他实例变量来提供帮助 当然可以。如果您需要在-init和-dealloc以外的时间更改此变量的值,则使用@属性意味着

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

我可以看出,在objective-c中为类使用属性有助于其他类访问实例变量,但是对于实例变量的内部使用,使用属性有什么好处/需要吗?事实上,对于属性,您必须是“self”。在它访问它之前,它似乎是,而不仅仅是实例变量的名称

或许我应该把这个问题分为:

  • 例如,表示IBOutlet控件的变量(如果是特殊的)
  • 在类的方法中可能需要的任何其他实例变量来提供帮助

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

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

    我通常不使用接口生成器,但我认为您始终需要IBOutlet的属性。我刚刚回答了一个人的问题,因为他没有得到很好的访问。您可能不需要(我不知道),但内存管理变得更容易

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

    self.object = newObject;
    
    取代

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

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

    我通常不使用接口生成器,但我认为您总是希望为您的iboutlet提供属性。我刚刚回答了一个人的问题,因为他没有得到很好的访问。您可能不需要(我不知道),但内存管理变得更容易

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

    self.object = newObject;
    
    取代

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

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

    嗨,Dave-没有完全理解您在这里的意思-您仍然必须在我假设的dealloc方法中释放属性?我建议在类扩展中添加任何此类
    @property
    。@Greg yep,您仍然需要在
    -dealoc
    -release
    (与正常情况一样)。但是在内部,您可以执行
    [self-setFoo:newFoo],所有释放旧值和保留新值的内存管理都将为您处理。这是非常有用的@Richard建议将声明放在类扩展中,这是一个很好的建议。+1(+10,如果可以的话)。封装内存管理至关重要。另一种方法是将它分散在整个代码中的各个地方,这使得当(而不是如果)忘记了某个需要保留或发布的地方时进行调试成为一场噩梦。尽管@property和dot语法的使用有些偶然;这里关键的是setter方法的使用,而不是创建它们的方法。手工编写的setter方法在封装方面也有同样的好处。@Greg如果您不使用
    self.
    ,那么您只是直接访问ivar,这完全绕过了属性setter。如果您愿意,可以执行
    [self-setFoo:newFoo]而不是
    self.foo=newFoo
    Hi Dave-我还没有完全明白你在这里的意思-你仍然需要在我一直假设的dealloc方法中释放属性?我建议在类扩展中添加任何这样的
    @property
    。@Greg yep,你仍然需要在
    -dealloc
    中释放
    (像正常情况一样)。但是在内部,您可以执行
    [self-setFoo:newFoo],所有释放旧值和保留新值的内存管理都将为您处理。这是非常有用的@Richard建议将声明放在类扩展中,这是一个很好的建议。+1(+10,如果可以的话)。封装内存管理至关重要。另一种方法是将它分散在整个代码中的各个地方,这使得当(而不是如果)忘记了某个需要保留或发布的地方时进行调试成为一场噩梦。尽管@property和dot语法的使用有些偶然;这里关键的是setter方法的使用,而不是创建它们的方法。手工编写的setter方法在封装方面也有同样的好处。@Greg如果您不使用
    self.
    ,那么您只是直接访问ivar,这完全绕过了属性setter。如果您愿意,可以执行
    [self-setFoo:newFoo]而不是
    self.foo=newFoo
    object=[newObject retain]
    。。。。这就是访问器如此重要的原因。当我们手写时,很容易忘记这些事情!:-)@谢尔姆:我没有意识到这一点,但我在证明一点,不是吗?:)<代码>对象=[newObject retain]
    。。。。这就是访问器如此重要的原因。当我们手写时,很容易忘记这些事情!:-)@谢尔姆:我没有意识到这一点,但我在证明一点,不是吗?:)