声明私有成员变量

9

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

使用 "@property" 设置适当的 getter/setter,似乎比在接口中声明 "@private" 更好。但我的理解是,这仍然会让其他类访问到这些变量。即使将属性声明为 "readonly",外部类也可以访问成员变量的引用并修改它!

因此,我猜想声明私有成员变量的最佳方式是不包含任何getter/setter,即不声明属性。这样做对吗?还是有更好的方法?

谢谢

1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
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 可见且可获取和设置;

@Oliver,您能否创建另一个问题,并将您的代码放在那里,以便更好地了解这个问题。顺便说一句,“unrecognized selector”表示您没有该特定选择器,它可以是属性或方法。您确定已经声明了具有“readwrite”特权的属性吗? - vfn
嗨@Oliver,我认为你有点困惑。我的答案适用于任何Objective-C/C/C++类型或Objective-C对象。你遇到的崩溃可能是由于对Objective-C选择器/消息系统工作原理的理解不足造成的。如果没有查看你的代码,猜测你做错了什么将会非常复杂。 - vfn
@Oliver,你的@property和@synthesize怎么样了?你是怎么写它们的?我不知道你对Obj-C的属性或类继承了解多少,但NSMutableArray是NSArray的子类,而NSArray又是NSObject的子类。正如我之前说的,当调用“setMyMutableArray”时出现“unrecognized selector”的意思是你没有实现“setMyMutableArray”方法。请创建一个包含.h和.m文件的新问题。这就是这个网站的工作方式。评论不应该用于提问/回答,而不幸的是我的回答没有任何问题。 - vfn
@vfn:撤销我的评论。我一再测试了,但仍然不知道为什么,但是我没有复现我所说的问题。但是...使用NSMutableThing,我发现readOnly属性并不能阻止向其中添加对象。你能否改进你的答案,以添加真正的readOnly属性的实现方式?我猜想正确的方法是手动编写访问器来返回一个不可变对象。但是我无法创建访问器方法,因为它会与prop生成重复代码。也许你有更好的解决方案,可以保持retain属性。 - Oliver
@Oliver,如果你想防止可变对象被改变,那么问题与私有/不可写属性完全不同。如果你真的需要保护你的可变iVar,你可以将你的属性声明为不可变。假设 NSMutableArray *_myArray; 和属性 @property(nonatomic, retain, readonly) NSArray *myArray; 在你的匿名类别中,你可以写 @property (nonatomic, retain, readwrite) NSMutableArray *myArray; - vfn
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,