alloc应该返回什么类型?

时间:2010-09-09 20:23:31

标签: objective-c

我有一个这样的方法,它使用类似的init方法对其他对象执行进一步的初始化。

- (Foo*)initWithInput:(NSMutableString*)i {
  bar = [[Bar alloc] initWithInput:input];
  return self;
}

这会产生一个警告“Foo.m:19:警告:不兼容的Objective-C类型分配'struct Foo *',预期'struct Bar *'”

我假设alloc方法返回一个(id)类型,然后编译器无法决定我想在分配的对象上使用哪个initWithInput:方法。我当然可以删除这样的警告,但它并不是非常漂亮

- (Foo*)initWithInput:(NSMutableString*)i {
  bar = [((Bar*)[Bar alloc]) initWithInput:input];
  return self;
}

是否有惯用的处理方式?

2 个答案:

答案 0 :(得分:5)

  

是否有惯用的处理方式   此?

Objective-C具有用于选择器的平面命名空间,并且不支持协变调度(Java和C ++)。因此,您需要根据论证对您的方法进行唯一命名。

这也是框架的标准模式。你[通常 - 有1或2个例外]没有看到两个具有相同名称的方法 - 相同的选择器 - 具有不同的论证。当它发生时 - 比如alloc的返回值 - 你会看到id被使用。

答案 1 :(得分:1)

所有init - 方法应该返回id而不是它们所属类的类型,正是出于这个原因。这实际上是Apple在某处记录的。但是我现在找不到这个链接。