Objective-C:我如何隐藏班级成员以外的班级成员?

时间:2010-12-30 14:11:12

标签: objective-c private-members class-members

我正在与某些事情作斗争,我找不到任何令人满意的解决方案。

我有一个带有“myMutableArray”成员的课程。

我希望该类能够管理自己在数组中添加和删除项目,因此我不希望任何其他类能够访问该成员并在其上调用NSMutableArray方法。

在理想的情况下,我想拥有一个私有的getter(能够调用self.myMutableArray)和这个成员的公共setter。

你知道我怎么做到这一点吗?

换句话说:

我想要其他课程

能够致电

- [oneInstance setMyMutableArray:thisArray]; // set
- oneInstance.myMutableArray = thisArray; // set using setter

- thisArray = oneInstance.myMutableArray; // get
- [oneInstance addItem:anItem]; // add

无法致电:

- [oneInstance.myMutableArray add:etc...] // add

我想要我的班级

能够致电

- self.myMytableArray = [NSMutableArray array]; // set
- thisArray = self.myMytableArray ; // get

谢谢。

2 个答案:

答案 0 :(得分:1)

你有什么理由需要公共制定者吗?听起来这个类本身就拥有这个数组。你可能最好不要提供对该字段的任何公共属性访问,并制作一个将值复制到私有字段的公共方法。

// public interface, in the .h file
@interface MyClass : // superclass, protocols, etc.
- (void) setSomething:(NSArray *)values;
@end

// private interface, not in the .h
@interface MyClass ()
@property (/* attributes */) NSMutableArray *myMutableArray;
@end

@implementation MyClass
@synthesize myMutableArray = myMutableArray_;

- (void) setSomething:(NSArray *)values
{
    [self.myMutableArray setArray:values];
}

@end

答案 1 :(得分:0)

foo.h中

@interface Foo : NSObject
@property(readonly, retain) NSArray * myReadonlyArray;
- (void) addItem: (Item *) anItem;
- (BOOL) publiclyDoSomething;
@end

Foo.m

@interface Foo()
@property(readwrite, retain) NSMutableArray * myMutableArray;
- (void) doSomethingInPrivate;
@end

@implementation Foo
@synthesize myMutableArray = myMutableArray_;

- (void) addItem: (Item *) anItem
{
    // assuming myMutableArray_ was already iniitialized
    [self.myMutableArray addObject: anItem];
}

- (NSArray *)myReadonlyArray
{
     return self.myMutableArray;
}

... rest of methods (including the public/private) implementations ...
@end

一些细节:

  • Objective-C有“实例变量”,而不是“成员变量”。

  • 上面定义了一个自动合成的公共getter和private setter。为清楚起见,我还添加了一个公共方法和一个私有方法。

  • Objective-C中的“Public”和“private”完全由编译器的可见性定义。 myMutableArray的设置器和方法doSomethingInPrivate只是私有的,因为无法导入@interface中的声明。

  • self.myMutableArray[self myMutableArray]做同样的事情; .语法只是等效方法调用的简写(除了这个问题之外还有一些边缘案例细节)

  • @property中的
  • @interface纯粹是方法声明的简称(带有一些额外的元数据)。

  • @interface Foo()类扩展程序,而不是类别。它的存在完全是出于上述目的;使用范围应该受限的其他声明性信息来扩展类的@interface。它可以出现在头文件中,例如,您只能在库的实现中导入以创建库私有功能。

  • 当您@dynamic @synthesize 都没有提供传统方法实施时,会使用
  • @property不需要它!

我可能忘了什么。