Предупреждение: «Конфликт типов ...» при создании инициализатора Objective-C (ios) - PullRequest
0 голосов
/ 14 мая 2011

Я хочу иметь возможность инициализировать один из моих классов чем-то похожим на это

ModelClass *aModelClass = [[ModelClass alloc] initWithXML:imageXML];

Так вот что я написал в интерфейсе файл:

-(id)initWithXML:(TBXMLElement *)imageXML

и так в файле :

-(id)initWithXML:(TBXMLElement *)imageXML
{
    self = [super init];

    if(imageXML) 
    {
        // do stuff with self.foo
        return self;
    }
    return nil;
}

Итак, я объявил это в файле интерфейса, а также в файле реализации. Но ошибка, которую я получаю в обоих случаях, заключается в том, что они конфликтуют Итак, как мне это сделать, если не объявить одну и ту же сигнатуру метода в обоих?

Ошибка, которую я теперь получаю:

Конфликтующие типы для «- (ID) initWithXML: (TBXMLElement *) ImageXML '

В основном я смотрел на эту статью , чтобы понять, как это сделать, и понять, как это должно быть сделано в Objective-C, но это не поможет мне решить мою проблему.

Ответы [ 3 ]

1 голос
/ 14 мая 2011

Возможно, это не так, но вы, похоже, пропустили точку с запятой в определении вашего интерфейса:

-(id)initWithXML:(TBXMLElement *)imageXML

должно быть

-(id)initWithXML:(TBXMLElement *)imageXML;

, но, возможно, это простоошибка копирования и вставки, когда вы писали свой вопрос.

Также убедитесь, что вы

#import "TBXML.h" 

в ModelClass.h (если вы включите его в ModelClass.h, тогда другие файлы .m, которыеimport ModelClass.h также получит определения для TBXMLElement, которые им понадобятся.

1 голос
/ 14 мая 2011

Вы возвращаетесь nil. Вы должны всегда должны возвращать объект. (Спасибо Джошу за указание на то, что вам не всегда нужно возвращать объект) Вот так:

-(id)initWithXML:(TBXMLElement *)imageXML {
    if (self = [super init]) {
        if(imageXML) {
            // do stuff with self.foo
        }
    }
    return self;
}

Кроме того, я только что вспомнил, что столкнулся с чем-то похожим на это сам. Убедитесь, что вы импортируете TBXML.h в оба класса, ModelClass, а также в контроллер, где вы создаете ModelClass. Проблема в том, что компилятор не знает, что такое TBXMLElement, поэтому вам нужно указать это путем импорта соответствующих заголовков.

0 голосов
/ 15 мая 2011

Спасибо за помощь! Некоторое время я ласкал в темноте и не нашел причину проблемы, хотя оба решения, опубликованные здесь "sudo rm -rf" и "idz", кажутся вероятными.

Я работал после того, как просто удалил свой код и снова написал его с самого начала.

...