Objective-C继承,字符串传播到超类

时间:2013-06-25 08:59:18

标签: objective-c inheritance nsstring

首先,我是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]是我得到的唯一警告。

有谁知道如何解决这个问题?

问候丹

1 个答案:

答案 0 :(得分:4)

m_nameNSString,不是char *。您必须使用%@格式说明符而不是%s进行记录。阅读格式字符串的文档。

评论:

  • Objective-C不是C ++。不要试图强制执行C ++样式的命名约定。调用该实例变量name,或animalName,或theName或其他任何内容。请勿将其称为m_name

  • 初始化程序通常称为initWithWhatever:,而不是initWhatever:。它更好地反映了方法的目的(使用名称初始化对象,而不是名称本身)。

  • 请检查 [super init]的返回值。如果它返回nil,则初始化程序将崩溃。惯用解决方案是if (self = [super initWithName:name])

  • 初始化方法再次按惯例返回id