如何修复此警告:“找不到方法(返回类型默认为'id')”

时间:2011-03-13 23:07:48

标签: iphone objective-c sdk warnings xcode4

我正试图从我的iPhone应用程序中删除一些警告。我得到的最多的是当我有一个void函数时,我用[self myFunction];来调用它。警告在我调用该函数的行上,它说:" Method' -myFunction'找不到(返回类型默认为' id')。"我需要做些什么来解决这个问题?感谢

8 个答案:

答案 0 :(得分:18)

在头文件中声明函数,如下所示:

 -(void)myFunction;

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

等等。

这比仅仅使编译器静默更重要:如果函数的返回类型不是指针(idanything*),特别是当它没有相同的大小时,你可以变得非常奇怪而且很难找到错误。

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 
}