Как исправить это предупреждение: «Метод не найден (тип возвращаемого значения по умолчанию равен« id »)» - PullRequest
14 голосов
/ 14 марта 2011

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

Ответы [ 8 ]

18 голосов
/ 14 марта 2011

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

 -(void)myFunction;

или

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

и т. Д. И т. Д.

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

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

6 голосов
/ 14 марта 2011

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

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

-(void)myFunction {
    // do something
}

Для «частной» функции, добавьте это вверху вашего файла .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, внутри раздела 'interface';после всех ваших свойств, и до @ конца.

Удачи!

3 голосов
/ 26 мая 2011

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

2 голосов
/ 22 июня 2012

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

- файл: 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
1 голос
/ 23 февраля 2012

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

1 голос
/ 19 декабря 2011

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

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

1 голос
/ 14 марта 2011

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

0 голосов
/ 04 января 2012

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

sky.h * * 1004

@interface sky : object {

}

-(void) doSomething:(int)param;

@end

sky.m

#import "sky.h"
@implementation sky

-(void) doSomething:(int)param

{

    //dosomething usefull 
}
...