【发布时间】:2014-05-02 22:13:39
【问题描述】:
我最近意识到使用 self.whatever = thing 从 init 内部访问类的属性是不合适的形式,而应该直接使用 _whatever = thing 访问属性。当我为基类设置值时,这很好用。但是,当我尝试在子类的 init 中设置值时,我收到错误“使用未声明的标识符 _whatever”。从子类的 init 内部使用 self.whatever 可以正常工作。
为了清楚起见,对于 @property int 在基础对象的接口中声明的任何内容,都会编译:
-(id) init {
self = [super init];
if (self) {
[self createName];
self.whatever = 100;
}
return self;
}
这不是:
-(id) init {
self = [super init];
if (self) {
[self createName];
_whatever = 100;
}
return self;
}
我想我在这里误解了一些东西。我尝试搜索我做错了什么,但我不知道要搜索的正确词。
根据要求,基类的标头:
#import <Foundation/Foundation.h>
@interface DTCharacter : NSObject
@property BOOL isIdle;
@end
我正在使用自动合成,所以在基类的实现中没有关于这个变量的任何内容。
子类的头文件也没有提及或引用变量。
我正在尝试在子类的实现中分配它:
-(id) init {
self = [super init];
if (self) {
[self createName];
_isIdle = YES; //says use of undeclared identifier
//this would work: self.isIdle = YES;
}
return self;
}
【问题讨论】:
-
实例变量默认是类私有的。为了让孩子们可以看到它们,你必须在你的类中声明它们
@interface。 -
我在基类的@interface 中声明它们,而不是在实现中。
-
在您的头文件中,还是在您的
*.m文件的@interface部分中?你需要做前者。如果您正在这样做,请为显示错误的两个类发布一个简短但完整的头文件和实现文件。 -
在我的标题中。我稍后会发布这些内容。
标签: objective-c inheritance initialization subclass