2011-03-14 26 views
1

我刚刚遇到Clang/LLVM today,并决定尝试一下。Clang在非常简单的类中生成警告“method”-init'not found“

我的系统是FreeBSD8.1-Release。 默认的系统编译器是GCC4.2.1,这是我一直使用到目前为止编译我的Objective-C项目。

我正在玩弄静态分析器,并想知道如何消除正在生成的警告之一。

MyClass.h

#import <objc/Object.h> 

@interface MyClass: Object { 
} 

-(MyClass*) init; 

@end 

MyClass.m

#import "MyClass.h" 

@implementation MyClass 

-(MyClass*) init { 
     self = [super init]; 
     if (self) { 
       // do stuff 
     } 
     return self; 
} 

@end 

警告:

%clang --analyze MyClass.m 
MyClass.m:7:9: warning: method '-init' not found (return type defaults to 'id') 
     self = [super init]; 
       ^~~~~~~~~~~~ 
1 diagnostic generated. 

我认为分析器不知道如何确定的类型(对象,在这种情况下)。有什么办法可以消除这个警告(除了通过抑制)吗?我看着铸造超级,但它看起来像是不允许的。

谢谢! 最大


更新

感谢Dave和bbum指着我在正确的方向为消除警告。现在我试图弄清楚为什么警告首先发生。

如果有人有任何想法或线索,我喜欢听到他们。

感谢, 最大

+0

警告很简单,它告诉你'super'没有'init'方法。 – paulbailey 2011-03-14 08:57:28

回答

3

两个问题:

  • 您应该NSObject,不Object被继承。
  • 您的init方法应该返回id而不是MyClass*
+0

仍然有几个运行时变体使用'Object'作为基类。由于OP位于非Mac OS X系统上,因此可能会发挥作用。但即使如此,尽快转移到“NSObject”通常是正确的答案。 – bbum 2011-03-14 02:00:12

+0

@bbum:哈,我完全错过了FreeBSD的一点。 – 2011-03-14 02:57:45

+0

感谢您输入戴夫。我安装了GNUstep(AppKit/Cocoa实现),并且Clang不再提出我上面描述的投诉。 – maxenglander 2011-03-14 04:21:58

0

的警告说,它不知道的任何方法都在该点范围命名-init。你需要导入一个头文件,声明-init,这可能是Foundation.h或者什么的,这取决于你使用的是什么系统。

相关问题