gpt4 book ai didi

objective-c - 公共(public)元素和属性(property)的使用

转载 作者:搜寻专家 更新时间:2023-10-30 20:04:01 25 4
gpt4 key购买 nike

我有点困惑;如果在 .h 文件中声明了一个对象,它会自动被视为“公共(public)”,对吗?但是,我们在 .h 文件中使用 @property 来编辑它们?这是我不明白的地方:我们对私有(private)对象使用 getter/setter,那么为什么我们对在 .h 文件中声明并因此被视为“公共(public)”的对象使用 @property

第二,我找到了这个例子:我不明白为什么我们在这段代码中使用 @synthesize 作为 primaryKey:http://staging.icodeblog.com/wp-content/uploads/2008/08/9-todom1.png以及为什么我们不为 database 对象使用 @property

最佳答案

如果一个对象 (ivar) 在 .h 文件中声明,那么它就是公共(public)的,这是不正确的。只有提供了 getter/setter 方法才有效,否则不提供。

事实上,@property/@synthesize 指令是用于声明和定义默认 getter/setter 方法的工具。因此,您无需自己编写它们,只需使用指令即可。

还值得注意的是,声明属性时您可以使用点表示法来引用对象的属性。而且,由于 retain/assign/copy 说明符,它们澄清了很多内容,即如何为该属性管理内存。 (当然,@synthesize 会为您正确地做到这一点)。

关于您的示例,实际上,ivar 是否与属性相关联是一种设计选择。可能,您只是重新考虑默认情况下在 .h 文件中声明的 ivars 是公共(public)的假设,它会变得更清楚。换句话说:primaryKey 是公共(public)的,database 不是。

可以找到一个非常好的教程here但也别忘了Apple docs .

编辑:

关于评论区的问题:

没有必要每个 ivar 都有一个属性,也没有必要有 getter/setter 以便在该类实现中使用。

@interface SomeClass : NSObject {
AnotherClass* _anotherClassObj;
AThirdClass* _aThirdClassObj;
}
@property (nonatomic, retain) AnotherClass* anotherClassObj;
@end

所以,这里有两个 ivar;只有一个有 @property 声明。在您的 .m 文件中,您可能有,例如<​​/p>

@implementation SomeClass;
@synthesize anotherClassObj = _anotherClassObj;

- (void)initWithClasses:(AnotherClass*)obj1 and:(AThirdClass*)obj2 {
.....
self.anotherClassObj = obj1;
_aThirdClassObj = obj2;
...
}

....
@end

在这段代码中:

  1. @synthesize 将为 anotherClassObj 提供 getter/setter 实现,因此您可以使用语法:self.anotherClassObj = obj1;该语法可以在类实现的内部和外部同等使用;

  2. 当您没有 getter/setter(自动生成的或自定义的)时,您可以使用语法 _aThirdClassObj = obj2; 直接分配给一个 ivar,具有简单指针的语义复制;无论如何,_aThirdClassObj 将无法从该类外部访问;

  3. 此外,@property ... anotherClassObj 尽管如此,您仍然可以直接在 .m 文件中引用 _anotherClassObj,例如 _anotherClassObj = xxx ,绕过 getter/setter,如果你需要的话。

有一件事你应该清楚,getter/setter 不仅仅是一种让 ivar 成为“公共(public)”的方式。它们还在管理保留计数方面发挥重要作用(取决于您在属性声明中的保留/分配/复制之间选择的说明符)。因此,在上面的 self.anotherClassObj = obj1; 中,obj1 被分配给 _anotherClassObj 并且它也被保留(如果 _anotherClassObj 之前指向一个对象,该对象将被发送一个 release)。原始 ivar 分配不提供这种便利。

在我看来,在决定我是否使用某个属性时,属性的保留计数管理功能远比可见性重要。

关于objective-c - 公共(public)元素和属性(property)的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6550009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com