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' 没有足够的静态信息。
此代码在 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' 没有足够的静态信息。