0

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

我有一个带有“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

谢谢你。

4

2 回答 2

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
于 2010-12-30T14:27:09.303 回答
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 和私有 setter。为了清楚起见,我还添加了一个公共方法和一个私有方法。

  • Objective-C 中的“公共”和“私有”完全由编译器的可见性定义。setter formyMutableArray和方法doSomethingInPrivate只是私有的,因为它们在 an 中的声明@interface不能被导入。

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

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

  • @interface Foo()类扩展而不是类别。它的存在正是为了上述目的;@interface使用应限制范围的附加声明性信息扩展类的。它可以出现在头文件中,例如,您只在库的实现中导入以创建库私有功能。

  • @dynamic当您既不@synthesize提供@property 也不提供常规方法实现时使用。 否则不需要!

我可能忘记了什么。

于 2010-12-30T18:01:47.417 回答