Я пытаюсь избавиться от некоторых из этих предупреждений из моего приложения для iPhone. Больше всего я получаю, когда у меня есть функция void, и я вызываю ее, используя [self myFunction];. Предупреждение находится в строке, где я вызываю функцию, и в ней говорится: «Метод '-myFunction' не найден (тип возврата по умолчанию равен 'id')». Что мне нужно сделать, чтобы исправить это? Спасибо
Как исправить это предупреждение: Метод не найден (тип возврата по умолчанию «id»)
Ответы (8)
Объявите функцию в заголовочном файле, например:
-(void)myFunction;
or
-(NSString*)myFunction;
-(id)myFunction;
-(NSInteger)myFunction;
-(BOOL)myFunction;
и т.д.
Это важнее, чем просто отключить компилятор: если возвращаемый тип функции не является указателем (id
или anything*
), особенно когда он не имеет того же размера, вы можете получить очень странные и трудно найти ошибки.
Например. если функция возвращает структуру CGRect
, а компилятор предполагает id
(как сказано в предупреждении), могут произойти очень странные вещи.
id
, что и означает, когда вы не объявляете возвращаемый тип.
- person Chuck; 14.03.2011
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.
Удачи!
Вам нужно импортировать файл .h, содержащий ваши методы.
У меня возникла аналогичная проблема, потому что у меня был другой заголовочный файл с тем же именем в другом подкаталоге в проекте, который, как я думал, я удалил. Это в конечном итоге заставляло компилятор думать, что метод не был объявлен в заголовке, потому что он искал неправильный заголовочный файл.
Я решаю эту проблему следующим образом:
--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
Убедитесь, что у вас есть -(void) myFunction; объявленный в вашем заголовочном файле, и ТАКЖЕ убедитесь, что myFunction ничего не возвращает.
Просто убедитесь, что функция размещена перед вызывающим в вашем .m-файле!! Я не знаю, правильный ли это способ делать что-то, но он удалил все эти предупреждения для меня.
И в примере кода Apple я не вижу, чтобы они объявляли все методы в файле h или m. Можно просто использовать сразу.
Убедитесь, что объект, который вы используете, имеет эту функцию, объявленную также в его заголовочном файле.
sky.h
:
@interface sky : object {
}
-(void) doSomething:(int)param;
@end
sky.m
:
#import "sky.h"
@implementation sky
-(void) doSomething:(int)param
{
//dosomething usefull
}