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

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


person Preston    schedule 13.03.2011    source источник
comment
Я предлагаю отредактировать ваш вопрос, чтобы включить рассматриваемый фрагмент кода.   -  person payne    schedule 14.03.2011
comment
Не могли бы вы опубликовать объявление своего метода (.h) и код вызова?   -  person Hetal Vora    schedule 14.03.2011
comment
+1 за попытку исправить предупреждения, это очень хорошая практика! Пока вы это делаете, в настройках проекта есть несколько флажков, где вы можете заставить компилятор предупреждать о других вещах.   -  person mvds    schedule 14.03.2011


Ответы (8)


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

 -(void)myFunction;

or

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

и т.д.

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

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

person mvds    schedule 13.03.2011
comment
Хорошо спасибо. Кроме того, если я ничего не возвращаю и это просто функция, следует ли использовать void? - person Preston; 14.03.2011
comment
Строго говоря, (void) не нужен, если вы ничего не возвращаете; но IMO, вы всегда должны писать его, чтобы ваш код был более понятен другим, кто его читает. - person Dave; 14.03.2011
comment
@Dave: я не думаю, что ты прав. Неверно не возвращать что-либо из метода, возвращающего id, что и означает, когда вы не объявляете возвращаемый тип. - person Chuck; 14.03.2011
comment
Мы оба правы. :) ПРЕДУПРЕЖДЕНИЕ говорит, что компилятор предполагает, что метод вернет тип идентификатора. Компилятор предполагает, что метод не был объявлен. Однако я предполагал, что метод @Preston борется с возвращаемым значением void, иначе он написал бы myVar = [self myFunction]. Если метод имеет возвращаемый тип, вы должны явно указать это в объявлении и определении метода. IMO, вы всегда должны явно объявлять возвращаемые типы для улучшения читаемости. - person Dave; 14.03.2011
comment
@Dave, @Chuck: Боюсь, Чак прав. Мало того, что компилятор предполагает возвращаемый тип id, я даже получаю предупреждение о конфликтующих возвращаемых типах, если объявляю -func, а затем реализую -(void)func. Таким образом, тип возврата по умолчанию на самом деле id. Следовательно, -func {return nil;} компилируется без предупреждения. - person mvds; 14.03.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 в разделе «интерфейс»; после всех ваших свойств и перед @end.

Удачи!

person Dave    schedule 13.03.2011
comment
Конечно. Общепринято скрывать методы через категорию «private», если они не являются частью контракта этого объекта с другими. Если вы видите предупреждение о том, что метод не найден; обычно это одна из двух проблем: 1) этот метод не существует для этого объекта; 2) вы не включили заголовочный файл. Чтобы уточнить, я не предлагаю вам добавлять объявление для метода, который вы не написали. - person Dave; 17.02.2012

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

person hOkaily    schedule 25.05.2011

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

person jpweber    schedule 23.02.2012

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

--file: MyObjectController.h--

#import "MyObject.h"

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

@end

--file: 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
person Viktor    schedule 22.06.2012

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

person Roger    schedule 13.03.2011

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

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

person user1084988    schedule 19.12.2011

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

sky.h:

@interface sky : object {

}

-(void) doSomething:(int)param;

@end

sky.m:

#import "sky.h"
@implementation sky

-(void) doSomething:(int)param

{

    //dosomething usefull 
}
person Rabih harb    schedule 04.01.2012