Objective c 目标C:我怎样才能把一个班级成员隐藏起来?

Objective c 目标C:我怎样才能把一个班级成员隐藏起来?,objective-c,private-members,class-members,Objective C,Private Members,Class Members,我正在和一些事情斗争,但我没有找到任何令人满意的解决办法 我有一个拥有“myMutableArray”成员的类 我希望该类能够管理自己从数组中添加和删除项,因此我不希望任何其他类能够访问该成员并对其调用NSMutableArray方法 在理想情况下,我希望这个成员有一个私有getter(能够调用self.myMutableArray)和一个公共setter 你知道我怎样才能做到这一点吗 换言之: 我想要其他的课程 能打电话 - [oneInstance setMyMutableArray:thi

我正在和一些事情斗争,但我没有找到任何令人满意的解决办法

我有一个拥有“myMutableArray”成员的类

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

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

你知道我怎样才能做到这一点吗

换言之:

我想要其他的课程 能打电话

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

- thisArray = oneInstance.myMutableArray; // get
- [oneInstance addItem:anItem]; // add
- self.myMytableArray = [NSMutableArray array]; // set
- thisArray = self.myMytableArray ; // get
无法拨打:

- [oneInstance.myMutableArray add:etc...] // add
我想要我的课 能打电话

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

- thisArray = oneInstance.myMutableArray; // get
- [oneInstance addItem:anItem]; // add
- self.myMytableArray = [NSMutableArray array]; // set
- thisArray = self.myMytableArray ; // get

谢谢。

您有什么理由需要公共设置器吗?听起来像是类本身拥有数组。您最好不要提供对字段的任何公共属性访问,而是创建一个将值复制到私有字段中的公共方法

// 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
福安 富美 一些细节:

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

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

  • Objective-C中的“Public”和“private”完全由编译器的可见性定义。
    myMutableArray
    的setter和方法
    doSomethingInPrivate
    仅是私有的,因为它们在
    @接口
    中的声明无法导入

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

  • @接口
    中的
    @属性
    纯粹是方法声明的简写(带有一点额外的元数据)

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

  • @dynamic
    用于既不
    @合成
    @属性
    也不提供常规方法实现的情况。否则就不需要了


我可能忘了什么。

谢谢。我正在研究这个解决方案。这样做,我如何为外部调用提供getter,但阻止像[oneInstance.myMutableArray add:etc…]这样的调用?您不能阻止任何人向任何对象发送消息。如果您希望它是安全的,请提供一个返回数组的不可变副本的方法。好主意。再加上我找到的另一个解决方案,它应该是近乎完美的。请参见:调用者是否能够对
something=
使用点符号?您可以将“something”声明为属性,使用@dynamic关键字让编译器知道您将自己提供方法,并使用这些方法将不可变接口呈现给可变数组。请注意,您所说的一项应该是允许的,
[oneInstance setMyMutableArray:thisArray],并且您所说的一项不应被允许,
oneInstance.myMutableArray=thisrarray是完全相同的东西。点表示法不调用setter;在编写
oneInstance.myMutableArray
时,您没有直接访问数组。只有两个问题:是否可以将公共getter设置为“copy”,将私有getter设置为retain?我想是的。为什么说@interface Foo()不是一个类别?它看起来像一个。。。这仅仅是语法上的差异,还是在这种差异的深层次上存在差异?这仍然允许外部对象执行
[[foo myMutableArray]addObject:baz]
。。。如何将属性声明为
NSArray
而不是
NSMutableArray
?添加了只读数组检索和不可变返回。l无需创建实际的NSArray,因为调用方无论如何都无法智能地区分可变数组和不可变数组。