【问题标题】:why can I not access instance variables set w/ properties in super class?为什么我不能访问在超类中设置 w/ 属性的实例变量?
【发布时间】:2012-09-09 18:44:47
【问题描述】:

我有以下对象:

@interface Foo : NSObject
@property (readonly, strong) NSString *someVar;
@end

@implemtation Foo
@sythensize someVar = _someVar;
@end

然后我将其子类化:

@interface Bar : Foo
-(id)initWithString:(NSString *)string;
@end

@implementation Bar
-(id)initWithString:(NSString *)string {
  _someVar = string;
}
@end

但我得到“使用未声明的标识符 _someVar”..... 为什么 Bar 不知道 foo 的实例变量 _someVar ?

【问题讨论】:

标签: objective-c


【解决方案1】:

始终使用 getter/setter。低级/直接访问仅适用于寻求十亿分之一秒的性能改进,在这种情况下,我质疑您是否应该完全放弃 Obj-C 并只改用 C。

这是我的做法:

@synthesize someVar;

-(id)initWithString:(NSString *)string {
  self.someVar = string;
}

或者,如果我有充分的理由不使用访问器方法,那么。我根本不使用@synthesize。

此外,在最新版本的 Xcode 中,您可以跳过 @synthesize 行。

【讨论】:

  • 这不是“不安全”,而是不可能。编译器不会让你这样做。这就是问题的重点。
  • “不安全”我的意思是你不应该在任何常见的代码情况下使用这种做法,即使是在它可以工作的情况下。我已经更新了我的答案以更清楚地解释它。
  • 我明白了.. 我的模式通常是拥有我知道永远不会改变的只读属性,并且在实例初始化时直接设置它们的实例变量,那样我不会永远不必担心其他对象会改变这些属性之一的值.....
  • 然后在您的公共@interface 中将其声明为只读,并有第二个私有@interface 将其声明为读/写。通常第二个接口是“无名的”并且与@implementation 在同一个文件中:stackoverflow.com/a/4586556/19851 不确定从子类中写入这些,也许更新你的问题来问这个?
猜你喜欢
  • 1970-01-01
  • 2019-11-15
  • 2020-04-05
  • 1970-01-01
  • 2016-02-14
  • 2011-09-23
  • 2012-02-25
  • 1970-01-01
  • 2012-10-24
相关资源
最近更新 更多