Iphone 目标C:在代码中是否使用@private visibility/access修饰符?

Iphone 目标C:在代码中是否使用@private visibility/access修饰符?,iphone,objective-c,ios,Iphone,Objective C,Ios,有3个修饰符:@private、@protected(默认)和@public。习惯于C++和其他更明智的语言,我总是使用@私有来为我的字段。在苹果的SDK示例中,我几乎看不到这一点——它们仅仅依赖于默认的SDK 有一天我意识到Objective-C继承是一个相当虚假的特性:从另一个接口派生接口并不意味着所有私有字段现在都可以重新定义。编译器仍然可以看到它们,并且不允许使用相同的名称定义新的私有字段,这和OOD中的经典封装范式是正交的 所以我有点沮丧。也许我对这门语言期望太高了,因为它只不过是对标

有3个修饰符:@private、@protected(默认)和@public。习惯于C++和其他更明智的语言,我总是使用@私有来为我的字段。在苹果的SDK示例中,我几乎看不到这一点——它们仅仅依赖于默认的SDK

有一天我意识到Objective-C继承是一个相当虚假的特性:从另一个接口派生接口并不意味着所有私有字段现在都可以重新定义。编译器仍然可以看到它们,并且不允许使用相同的名称定义新的私有字段,这和OOD中的经典封装范式是正交的

所以我有点沮丧。也许我对这门语言期望太高了,因为它只不过是对标准C语言的一种构建


那么您在代码中使用@private吗?为什么?

我想总是使用
@private
是个好主意,但我过去从来没有这样做过,因为除了
init
dealloc
方法之外,我通常对几乎所有ivar访问都使用属性访问器。所以在实践中,我很少会遇到错误访问IVAR的问题

另外,如果您的目标是iOS 4+,那么如果您使用
@synthesis
,则不需要为属性声明IVAR



我应该注意的是,如果您编写的库代码是由其他开发人员子类化的,那么使用
@private
将更为重要。

这只对苹果公司或那些希望在头文件中只向自己公开某些字段的用户有用。我们从不使用它,因为访问者模型允许您公开(或不公开)您想要的内容。既然我有头文件和源文件,那么私有文件到底有什么好处呢?ObjuleC不是C++,所以@私有有不同的用途。p> 我这样做是出于习惯,但这真的没关系,除非你提供一个二进制框架,其他人会链接agianst,我很确定你不会这样做


@private
所做的只是限制对象结构成员的可见性(像
obj->\u ivar
一样访问,而不是
[obj getter]
obj.getter
)。这是一个很好的健全性检查,因为如果您尝试在类外执行它,它将出错——几乎唯一使用直接结构访问的地方是在实现
NSCoding
NSCopying
时,这些仍然有效——但这并不能真正为您带来太多好处。

在1989年以来我用Objective-C编写的所有代码中,我从来没有费心使用@ Pube、@ Pror、或@ Pr.<……P>……C++……Shan.……………………不好,和目标C Sealsith:……相比,我现在主要使用C++。Objective-C是一种非常小的语言我应该发布另一个问题吗?:)@SultZ99 99:我刚才讲的是C++。我在问,在什么样的情况下,有两个同名的私有成员变量有用吗?如果他们有相同的名字,为什么他们不是一个共同的或更具描述性的名字?我问,因为我是新的C++,我不能想到任何情况下,有两个相同命名的私有成员变量是一个好主意。这是有用的信息-我不知道IVAR是可选的在V4+。是的,因为我从来没有使用对象-IVAR,我不担心使我的IVARS私有。虽然物业不再正式需要IVARS,没有它们似乎会导致一些错误。合成IVAR没有出现在调试器中确实令人讨厌。这就是GDB——我想知道带有LLVM编译器的LDB是否也有同样的问题。这篇文章中的第二个烦恼应该是没有意义的,除非你直接访问超类ivar,我认为大多数人都避免这样做。
@private
实际上限制了比
obj->\u ivar
结构多一点的内容。在子类的方法中,如果没有
@private
,您可以像访问自己的ivar一样直接访问祖先ivar,即
\u parent\u ivar
而不是
self->\u parent\u ivar