我有一个这样的方法,它使用类似的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;
}
是否有惯用的处理方式?
答案 0 :(得分:5)
是否有惯用的处理方式 此?
Objective-C具有用于选择器的平面命名空间,并且不支持协变调度(Java和C ++)。因此,您需要根据论证对您的方法进行唯一命名。
这也是框架的标准模式。你[通常 - 有1或2个例外]没有看到两个具有相同名称的方法 - 相同的选择器 - 具有不同的论证。当它发生时 - 比如alloc
的返回值 - 你会看到id
被使用。
答案 1 :(得分:1)
所有init
- 方法应该返回id
而不是它们所属类的类型,正是出于这个原因。这实际上是Apple在某处记录的。但是我现在找不到这个链接。