首先,我是Objective-C的初学者。 目前我正试图解决以下问题:
@interface Animal : NSObject {
@private
NSString* m_name;
}
-(Animal*) initName:(NSString*)name;
-(void) printName;
@implementation Animal
-(Animal*) initName:(NSString*)name {
self = [super init];
m_name = name;
return self;
}
-(void) printName {
NSLog(@"%s", m_name);
}
@end
@interface Bird : Animal {
}
-(Bird*) initName:(NSString*)name;
@implementation Bird
-(Bird*) initName:(NSString*)name {
self = [super initName:name];
return self;
}
@end
int main() {
Animal* bird = [[Bird alloc] initName:@"abird"]; // warning: assignment from distinct Objective-C type
[bird printName]; // prints invalid letters
[bird release];
}
我想将构造函数参数name
传播到超类,但它不起作用。
我还尝试在构造函数中打印名称,但没有成功。
包含所有必需的标题。创建子类对象时的警告warning: assignment from distinct Objective-C type [enabled by default]
是我得到的唯一警告。
有谁知道如何解决这个问题?
问候丹
答案 0 :(得分:4)
m_name
是NSString
,不是char *
。您必须使用%@
格式说明符而不是%s
进行记录。阅读格式字符串的文档。
评论:
Objective-C不是C ++。不要试图强制执行C ++样式的命名约定。调用该实例变量name
,或animalName
,或theName
或其他任何内容。请勿将其称为m_name
。
初始化程序通常称为initWithWhatever:
,而不是initWhatever:
。它更好地反映了方法的目的(使用名称初始化对象,而不是名称本身)。
请检查 [super init]
的返回值。如果它返回nil
,则初始化程序将崩溃。惯用解决方案是if (self = [super initWithName:name])
初始化方法再次按惯例返回id
。