Objective c 目标C:将IVAR公开或为其合成属性?我应该什么时候使用属性?

Objective c 目标C:将IVAR公开或为其合成属性?我应该什么时候使用属性?,objective-c,properties,ivar,Objective C,Properties,Ivar,我的类中有一些实例变量,我希望在任何地方都可以访问它们。像这样: @interface SomeObject : NSObject { @public NSString *someString; } @end @implementation SomeObject @end 我可以使用下面的->语法从实例访问属性,就像在C++中一样: someObjectInstance->someString 我是否应该为someString创建一个属性,而我只希望外部世界可

我的类中有一些实例变量,我希望在任何地方都可以访问它们。像这样:

@interface SomeObject : NSObject
{
    @public
        NSString *someString;
}
@end

@implementation SomeObject
@end
我可以使用下面的
->
语法从实例访问属性,就像在C++中一样:

someObjectInstance->someString

我是否应该为
someString
创建一个属性,而我只希望外部世界可以访问它?我会在我的界面中为
someString
创建一个
@property
,并在我的实现中合成它,这将使我能够使用点语法访问它。

一般来说,如果你想公开数据,你应该使用properties。将实例变量公开通常是一个坏主意。

这是一种更面向对象的方法,因为当使用属性时,如果希望它做其他事情,您可以稍后更改getter/setter(而不是合成它)。

是,因为当您将它设置为
@属性时,实际上是在指导人们使用它来调用
setSomeString
someString
方法。即使您正在合成它们,使用这些方法也会提高代码质量,因为如果需要,您可以更改它们。如果您只是使用指针引用,如果您发现自己需要拦截访问,您将无法进行

真正的问题是:为什么这是一个坏主意?因为它使你的班级未来的改变变得不可能。。。如果您想删除实际的ivar,并通过手工实现的访问器方法返回一些其他值,该怎么办?如果在这种特殊情况下,我相当确定我不想手工实现访问器方法,该怎么办。在这种情况下使用公共IVAR是否正确?这更像是一个一般的面向对象问题,而不是一个特定于objective-c的问题。此外,养成只通过getter和setter进行访问的习惯是一个好的做法,因为它允许实现类控制访问(例如,计算访问某个值的次数).我不想以后更改getter/setter,至少在这种情况下不想更改?在这里使用公共IVAR是否合理?参见我对类似问题的回答。