我正在与某些事情作斗争,我找不到任何令人满意的解决方案。
我有一个带有“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
谢谢。
答案 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)
@interface Foo : NSObject
@property(readonly, retain) NSArray * myReadonlyArray;
- (void) addItem: (Item *) anItem;
- (BOOL) publiclyDoSomething;
@end
@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
。 不需要它!
我可能忘了什么。