需要在Objective-C中声明一个公共实例变量。

12

我正在尝试为Objective-C(用于iOS)中的自定义按钮类声明一些实例变量:

@interface PatientIDButton : UIButton {
    NSUInteger patientID;
    NSString * patientName;
}
@end

不过,这些变量现在是私有的,我需要让其他类可以访问它们。我想我可以为它们创建访问器函数,但我该如何使变量本身成为公共的?


3
FYI,将ivars公开是非常不习惯的,而且取决于您是否使用ARC,可能会大大复杂化内存管理。 - Chuck
1
@chuck所说的是对的。直接访问实例变量是一种非常糟糕的编程模式。这会破坏封装性并且会影响到KVO等其他功能。 - bbum
你真的不应该使用显式实例变量。据我了解,苹果现在鼓励(并且自己也使用)仅使用属性。而且通过隐式合成,它们既简单又强大。 - Kevin
1个回答

19
为了使实例变量公开,使用@public关键字,就像这样:
@interface PatientIDButton : UIButton {
    // we need 'class' level variables
    @public NSUInteger patientID;
}
@end

当然,您需要记住将“原始”变量暴露给公共访问的所有标准预防措施:最好使用属性,因为这样可以在稍后更改其实现时保留灵活性。

最后,您需要记住,访问公共变量需要解除引用 - 可以使用星号或->运算符:

PatientIDButton *btn = ...
btn->patientID = 123; // dot '.' is not going to work here.

1
这似乎比必要的要复杂得多。为什么不在头文件中声明一个公共属性?@property NSUInteger patientID。然后,每个按钮实例都可以通过标准的Obj-C方法进行访问。myButton.patientID。 - Dan Fairaizl
1
是的,属性也很有意义。谢谢大家! - easythrees
3
为什么应该使用 (*btn).patientID,而不是其他方式? - Sergey Kalinichenko
1
@dasblinkenlight:当Objective-C被创建时,这是一个非常不同的世界。它最初是建立在C语言之上的一个微小的类似Smalltalk的对象系统,非常类似于C++中演变出来的C With Classes。那时还没有NSObject,甚至没有任何保留或释放的概念,消息调用的开销被认为相当奢侈。 - Chuck
在测试的上下文中,有时您想测试自定义getter或setter是否与ivar相关联,那么您会推荐什么?@bbum - Diogo T
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接