公共物品和财产的使用

时间:2011-07-01 15:31:16

标签: objective-c cocoa properties instance-variables

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

第二件事,我找到了这个示例:我不明白为什么我们在此代码中使用@synthesize primaryKeyhttp://staging.icodeblog.com/wp-content/uploads/2008/08/9-todom1.png 为什么我们不为@property对象使用database

2 个答案:

答案 0 :(得分:3)

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

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

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

关于您的样本,事实上,ivar是否与某个属性相关联是一种设计选择。可能,您只是重新考虑这样的假设,即.h文件中声明的ivars默认是公开的,并且它将变得更加清晰。换句话说:primaryKey是公开的,database不是。

可以找到一个非常好的教程here,但也不要忘记Apple docs

编辑:

关于评论部分的问题:

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

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

所以,这里有两个伊娃;只有一个人获得了@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,如果您需要它。

  4. 你应该清楚的一点是,getter / setter不仅仅是让ivar“公开”的一种方式。它们在管理保留计数方面也起着重要作用(取决于您在属性声明中的retain / assign / copy中选择的说明符)。因此,在上面的self.anotherClassObj = obj1;中,obj1被分配给_anotherClassObj并且它也被保留(如果_anotherClassObj之前指向一个对象,那么该对象将被发送一个{ {1}})。原始的ivar任务不提供这种设施。

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

答案 1 :(得分:2)

标题中并非所有内容都是公开的,默认情况下,ivars({}中的项目)是@protected。 @property的目的是数据封装。 @synthesize或@dynamic用于声明您希望实现属性的方式,并且需要使用一个或另一个来防止崩溃和警告。

资源:
Defining Classes @protected,@ package,@ private,@ public reference
Declared Properties @property参考