Обычно это означает, что существует несколько initWithSource:
имен методов в разных классах с конфликтующими типами аргументов. Помните, что если переменная имеет тип id
, компилятор не знает, что это за класс. Таким образом, если вы вызываете initWithSource:
для id
-типового объекта, а у нескольких классов есть метод initWithSource:
, компилятор по существу просто выбирает один из двух. Если он выберет «неправильный», то вы получите «отдельный тип Objective-C».
Так почему это происходит с вами? Я не уверен на 100%, но помните, что +[TBCTouchDelegate alloc]
возвращает id
. Таким образом, создание цепочки вызовов alloc / init эквивалентно следующему:
id o = [TBCTouchDelegate alloc];
touchDelegate = [o initWithSource:self];
Следовательно, вы вызываете initWithSource:
для переменной id
. Если существует конфликтующий метод initWithSource:
, вы можете получить эту ошибку компилятора.
Есть ли конфликтующий метод? Я проверил систему, и единственный конфликтующий был в NSAppleScript
:
- (id)initWithSource:(NSString *)source;
Теперь NSAppleScript
является частью Foundation, но я заметил, что это код iPhone. Так, возможно, вы получаете эту ошибку только при компиляции для симулятора, а не устройства?
В любом случае, если это ваша проблема, вы можете обойти ее, разделив alloc / init на две разные строки:
touchDelegate = [TBCTouchDelegate alloc];
touchDelegate = [touchDelegate initWithSource:self];
Теперь вы вызываете initWithSource:
для полностью типизированной переменной (вместо id
), поэтому компилятору больше не нужно угадывать, какую из них выбрать. Или вы можете разыграть возврат из +alloc
:
touchDelegate = [(TBCTouchDelegate *)[TBCTouchDelegate alloc] initWithSource:self];
Другое решение - переименовать initWithSource:
, чтобы избежать конфликта и, возможно, сделать его более наглядным. Вы не говорите, как называется класс в настоящее время, и для чего предназначен «источник», поэтому я не могу выбросить какие-либо возможности.