我正试图从我的iPhone应用程序中删除一些警告。我得到的最多的是当我有一个void函数时,我用[self myFunction];来调用它。警告在我调用该函数的行上,它说:" Method' -myFunction'找不到(返回类型默认为' id')。"我需要做些什么来解决这个问题?感谢
答案 0 :(得分:18)
在头文件中声明函数,如下所示:
-(void)myFunction;
或
-(NSString*)myFunction;
-(id)myFunction;
-(NSInteger)myFunction;
-(BOOL)myFunction;
等等。
这比仅仅使编译器静默更重要:如果函数的返回类型不是指针(id
或anything*
),特别是当它没有相同的大小时,你可以变得非常奇怪而且很难找到错误。
E.g。如果一个函数返回一个CGRect
结构,并且编译器假设id
(如警告所示),那么真的很奇怪。
答案 1 :(得分:6)
您需要在头文件(.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”部分中;在所有属性之后,在@end之前。
祝你好运!答案 2 :(得分:3)
您需要导入包含您的方法的.h文件
答案 3 :(得分:2)
接下来我决定这个问题:
- 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
答案 4 :(得分:1)
确保你有 - (void)myFunction;在头文件中声明,并确保myFunction不返回任何内容。
答案 5 :(得分:1)
只需确保该函数放在.m文件中的调用者之前! 我不知道这是否是正确的做事方式,但它确实消除了对我的所有警告。
在apple的示例代码中,我没有看到他们在h或m文件中声明所有方法。可以马上使用它。
答案 6 :(得分:1)
我有一个类似的问题弹出给我,这是因为我在项目中的另一个子目录中有另一个同名的头文件,我以为我已经删除了。这最终使编译器认为该方法未在标头中声明,因为它查找的是错误的头文件。
答案 7 :(得分:0)
确保您正在使用的对象也在其头文件中声明了此函数。
sky.h
:
@interface sky : object {
}
-(void) doSomething:(int)param;
@end
sky.m
:
#import "sky.h"
@implementation sky
-(void) doSomething:(int)param
{
//dosomething usefull
}