Как исправить это предупреждение: "Метод не найден (тип возврата по умолчанию -" id ")

Я пытаюсь избавиться от некоторых из этих предупреждений от моего приложения iPhone. Тот, который я получаю больше всего, это когда у меня есть функция void, и я называю это с помощью [self myFunction];. Предупреждение находится в строке, где я вызываю функцию, и она говорит: "Метод" -myFunction "не найден (тип возврата по умолчанию -" id ")". Что мне нужно сделать, чтобы исправить это? Благодаря

Ответы

Ответ 1

Объявите функцию в вашем файле заголовка, например:

 -(void)myFunction;

или

 -(NSString*)myFunction;
 -(id)myFunction;
 -(NSInteger)myFunction;
 -(BOOL)myFunction;

и т.д.

Это имеет большее значение, чем просто замолчать компилятор: если возвращаемый тип функции не является указателем (id или anything*), особенно когда он не имеет одинакового размера, вы можете получить действительно странно и трудно найти ошибки.

например. если функция возвращает структуру CGRect, а компилятор предполагает id (как предупреждает предупреждение), действительно будут странные вещи.

Ответ 2

Вам нужно определить эту функцию в файле заголовка (.h) (если он должен быть видимым для других классов) или в вашем файле реализации (.m), если он является приватным для вашего класса.

Например, если вы используете метод:

-(void)myFunction {
    // do something
}

Для функции "private" добавьте это вверху вашего файла .m; перед линией @implementation MyCoolClass.

@interface MyCoolClass()  // <--- no 'category name' hides methods just for this file
-(void)myFunction;     // <--- add the method here
-(void)myOtherFunction;
-(void)doSomeCoolThingWithThisString:(NSString *)firstName;
@end

ИЛИ если вы хотите вызвать метод из других файлов, добавьте его в свой .h файл в разделе "интерфейс"; после всех ваших свойств и перед @end.

Удачи!

Ответ 3

Вам нужно импортировать файл .h, содержащий ваши методы

Ответ 4

Я решаю эту проблему следующим образом:

- файл: MyObjectController.h -

#import "MyObject.h"

@interface MyObjectController
{
    MyObject * obj;
}
-(void) makeSomething;

@end

- файл: MyObjectController.mm -

#import "MyObjectController.h"

@implementation MyObjectController

-(void) makeSomething {}

@end

--- файл MyObject.h ----

@class MyObjectController;

@interface MyObject
{
    MyObjectController * objController;
}
-(void) callMakeSomethingFromObjController;

@end

--- файл MyObject.mm ----

#import "MyObject.h"  
#import "MyObjectController.h" //Add this line!!! And compiller will found makeSomething    

@implementation MyObject

-(void) callMakeSomethingFromObjController
{
     [objController makeSomething];//warning was here:instance method '-makeSomething' not found (return type defaults to 'id')  
}

@end

Ответ 5

Убедитесь, что у вас есть - (void) myFunction; объявленные в вашем файле заголовка, и также убедитесь, что myFunction ничего не возвращает.

Ответ 6

Просто убедитесь, что функция помещена перед вызывающим в вашем файле .m! Я не делаю это правильно, но он удаляет все эти предупреждения для меня.

И в примере кода apple, я не вижу, что они объявляют все методы в файле h или m. Может просто использовать его сразу.

Ответ 7

У меня возникла аналогичная проблема для меня, и это было потому, что у меня был другой заголовочный файл с тем же именем в другом подкаталоге в проекте, который, как я думал, я удалил. Это в конечном итоге заставило компилятор думать, что метод не был объявлен в заголовке, потому что он искал неправильный заголовочный файл.

Ответ 8

Убедитесь, что объект, который вы используете, объявляет эту функцию в файле заголовка.

sky.h:

@interface sky : object {

}

-(void) doSomething:(int)param;

@end

sky.m:

#import "sky.h"
@implementation sky

-(void) doSomething:(int)param

{

    //dosomething usefull 
}