【问题标题】:How do I fix this warning: "Method not found (return type defaults to 'id')"如何解决此警告:“找不到方法(返回类型默认为 'id')”
【发布时间】:2011-07-14 16:02:46
【问题描述】:

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

【问题讨论】:

  • 我建议编辑您的问题以包含有问题的代码片段。
  • 能否请您发布您的方法声明(.h)和调用代码?
  • +1 用于尝试修复警告,这是非常好的做法!当你在它的时候,项目设置中有几个复选框,你可以让编译器警告更多的东西。

标签: iphone objective-c sdk warnings xcode4


【解决方案1】:

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

 -(void)myFunction;

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

等等等等

这比仅仅让编译器静音更重要:如果函数的返回类型不是指针(idanything*),尤其是当它的大小不同时,你可以得到奇怪且难以发现的错误。

例如如果一个函数返回一个CGRect 结构,并且编译器假定id(如警告所述),那么将会发生非常奇怪的事情。

【讨论】:

  • 好的,谢谢。另外,如果我没有返回任何东西并且它只是一个函数,我应该使用 void 吗?
  • 严格来说,如果您不返回任何东西,则不需要 (void);但是 IMO 你应该总是写它,这样你的代码就会被其他阅读它的人更直接地理解。
  • @Dave:我不认为你就在那儿。不从返回 id 的方法中返回某些东西是不正确的,这就是您不声明返回类型时的含义。
  • 我们都是正确的。 :) 警告说编译器“假定”该方法将返回一种“id”类型。编译器假定这是因为未声明该方法。然而,I 假设@Preston 方法正在与返回的 void 作斗争,否则他会写“myVar = [self myFunction]”。如果方法具有返回类型,则必须在方法声明和定义中明确说明。 IMO,您应该始终明确声明返回类型以提高可读性。
  • @Dave, @Chuck:恐怕 Chuck 是对的。编译器不仅假定id 返回类型,如果我声明-func 然后实现-(void)func,我什至会收到“返回类型冲突”警告。所以默认的返回类型其实就是id。因此,-func {return nil;} 编译时没有警告。
【解决方案2】:

您需要在头文件 (.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 之前。

祝你好运!

【讨论】:

  • 当然。如果方法不属于该对象与其他对象的合同的一部分,则通常通过“私有”类别“隐藏”方法。如果您看到方法未找到警告;通常这是两个问题之一:1)该对象不存在该方法; 2)你没有包含头文件。澄清一下,我并不是建议您为不是您编写的方法添加声明。
【解决方案3】:

您需要导入包含您的方法的 .h 文件

【讨论】:

    【解决方案4】:

    我遇到了类似的问题,这是因为我认为我已删除的项目的不同子目录中有另一个同名的头文件。这最终使编译器认为该方法没有在头文件中声明,因为它在错误的头文件中查找。

    【讨论】:

      【解决方案5】:

      我接下来决定这个问题:

      --文件: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
      

      【讨论】:

        【解决方案6】:

        确保你有 -(void) myFunction;在您的头文件中声明,并且还确保 myFunction 不返回任何内容。

        【讨论】:

          【解决方案7】:

          只要确保在你的 .m 文件中把函数放在调用者之前!! 我不知道这是否是正确的做事方式,但它确实为我消除了所有这些警告。

          在苹果的示例代码中,我没有看到他们在 h 或 m 文件中声明所有方法。可以直接使用。

          【讨论】:

            【解决方案8】:

            确保您使用的对象在其头文件中也声明了此函数。

            sky.h:

            @interface sky : object {
            
            }
            
            -(void) doSomething:(int)param;
            
            @end
            

            sky.m:

            #import "sky.h"
            @implementation sky
            
            -(void) doSomething:(int)param
            
            {
            
                //dosomething usefull 
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-09-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多