5

このコードは 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:競合が表示されますが、iOS 8.3 で新しくなったに違いないと推測しています。CAEmitterBehavior

を に変更する[self alloc][AGNetworkRequest alloc]、このメソッドを継承するサブクラスは親オブジェクトを返すだけになり、このクラスの設計方法とは逆になります。

メソッド名を変更せずに競合を解消する方法はありますか (アプリ全体のすべてのメソッド呼び出しを変更する必要があります)。

4

1 に答える 1

5

alloc return をキャストします。

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

これにより、呼び出しを行うのに十分な情報がコンパイラに提供されます。コンパイラがパラメーターの長さを認識していない場合、実行時に呼び出しが失敗する可能性があります (デバッグが非常に困難になる可能性があります)。

id ではなく instancetype を返すことでこれを修正することになっています (allocWithZone は自動的に instancetype を返します...) が、「self」を使用しているため十分な静的情報がないため可能です。

于 2015-04-10T17:02:00.783 に答える