5

此代码在 Xcode 6.2 和 6.3 之间没有更改,但包含[self alloc]now 的行会导致错误:

Multiple methods named 'initWithType:' found with mismatched result, parameter type or attributes

@implementation AGNetworkDataRequest

+ (instancetype)networkDataRequestWithType:(AGNetworkDataRequestType)type
{
    AGNetworkDataRequest *r = [[self alloc] initWithType:type];//error here
    return r;
}

- (id)initWithType:(AGNetworkDataRequestType)type
{
    //typical init code
}

//...

如果我 Cmd+clickinitWithType:调用,我会在 中显示冲突CAEmitterBehavior,这是我们项目中根本没有引用的对象,但我猜在 iOS 8.3 中一定是新的。

如果我将 更改[self alloc][AGNetworkRequest alloc],继承此方法的子类将只返回父对象,这与我们设计此类的方式相反。

有什么方法可以在不更改方法名称的情况下消除冲突(这需要更改整个应用程序中的所有方法调用)?

4

1 回答 1

5

投射你的分配回报。

[(AGNetworkDataRequest*)[self alloc] initWithType:type];

这将为编译器提供足够的信息来进行调用。如果编译器不知道参数的长度,则调用可能会在运行时失败(并且可能很难调试)。

返回 instancetype 而不是 id 应该可以解决此问题(allocWithZone 将自动返回 instancetype ...),但这是可能的,因为您使用的是 'self' 没有足够的静态信息。

于 2015-04-10T17:02:00.783 回答