Xcode 6.3/iOS 8.3 中的新功能:为方便构造函数使用自分配会导致构建错误

new in Xcode 6.3/iOS 8.3: using self alloc for convenience constructor causes build error

此代码在 Xcode 6.2 和 6.3 之间没有变化,但包含 [self alloc] 的行现在导致错误:

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+单击 initWithType: 调用,我会在 CAEmitterBehavior 中看到冲突,一个对象根本没有在我们的项目中引用,但我猜一定是新的iOS8.3.

如果我将 [self alloc] 更改为 [AGNetworkRequest alloc],继承此方法的子 class 将只是 return 父对象,这与我们的方式相反设计了这个 class.

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

施放你的分配 return。

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

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

returning instancetype 而不是 id 应该可以解决这个问题(allocWithZone 会自动 return instancetype ...)但这是可能的,因为你正在使用 'self' 没有足够的静态信息。