Objective c 目标C:我怎样才能把一个班级成员隐藏起来?
我正在和一些事情斗争,但我没有找到任何令人满意的解决办法 我有一个拥有“myMutableArray”成员的类 我希望该类能够管理自己从数组中添加和删除项,因此我不希望任何其他类能够访问该成员并对其调用NSMutableArray方法 在理想情况下,我希望这个成员有一个私有getter(能够调用self.myMutableArray)和一个公共setter 你知道我怎样才能做到这一点吗 换言之: 我想要其他的课程 能打电话Objective c 目标C:我怎样才能把一个班级成员隐藏起来?,objective-c,private-members,class-members,Objective C,Private Members,Class Members,我正在和一些事情斗争,但我没有找到任何令人满意的解决办法 我有一个拥有“myMutableArray”成员的类 我希望该类能够管理自己从数组中添加和删除项,因此我不希望任何其他类能够访问该成员并对其调用NSMutableArray方法 在理想情况下,我希望这个成员有一个私有getter(能够调用self.myMutableArray)和一个公共setter 你知道我怎样才能做到这一点吗 换言之: 我想要其他的课程 能打电话 - [oneInstance setMyMutableArray:thi
- [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”完全由编译器的可见性定义。
的setter和方法myMutableArray
仅是私有的,因为它们在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,因为调用方无论如何都无法智能地区分可变数组和不可变数组。