2010-08-26 112 views
9

几个星期前我开始学习Objective-C,但我仍然不明白如何正确管理类的封装。在类中声明私有成员变量的最佳方式是什么?声明私有成员变量

看起来,用“@property”为你的成员变量设置正确的getter/setter是正确的方法,不仅仅是在界面中声明它“@private”。但在我看来,这仍然给其他类访问这些变量。即使您将属性声明为“只读”,外部类也可以访问对成员变量的引用并对其进行修改!

所以我猜测声明一个私有成员变量的最佳方式是不包含任何通过声明属性的三字代码/ setter。我对吗?或者,还有更好的方法?

感谢

回答

23

,如果你不希望它的其他类访问,宣布对你实行@property,创建一个匿名类为类。

头文件:

// MyClass.h 
@interface MyClass : NSObject { 
    NSObject *_privateObject; 
    NSObject *_readonlyObject; 
    NSObject *_publicObject; 
} 

@property (nonatomic, retain, readonly) NSObject *readonlyObject; 
@property (nonatomic, retain) NSObject *publicObject; 

@end 

实现:

// MyClass.m 
@interface MyClass() 
    @property (nonatomic, retain) NSObject *privateObject; 
    // Make it writable on the implementation 
    @property (nonatomic, retain, readwrite) NSObject *readonlyObject; 
@end 

@implementation MyClass 

@synthesize privateObject = _privateObject; 
@synthesize readonlyObject = _readonlyObject; 
@synthesize publicObject = _publicObject; 

这些是三个不同的性质的例子。

  • privateObject在其他类中不可见;
  • readonlyObject是可见的,但是只读;
  • publicObject是可见的,可以被get和set;
+0

好吧,所以使用一个类别我可以完全隐藏一个成员变量。但是我仍然不明白为可见成员使用“只读”的原因,因为它将引用返回给对象。人们可以修改引用并在其上写下,即使它没有setter。 – 2010-08-26 02:41:15

+0

好点!我将尝试调查目标-c给予的保护目标。我的猜测是,只要您尝试更改被引用对象的值,它就会创建一个副本,并且更改不会传播到受保护的对象。这里是文档:http://developer.apple.com/mac/library/documentation/cocoa/conceptual/objectivec/Articles/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW19 – vfn 2010-08-26 03:14:00

+0

@Oliver ,你会介意为此创建另一个问题,并将你的代码放在那里,让我们更好地理解这个问题。 BTW“无法识别的选择器”意味着你没有那个特定的选择器,可以是属性或方法。你确定你已经声明了“readwrite”权限吗? – vfn 2011-09-18 23:34:07