指向方法的返回types的“预期types”错误
我试图编译,但每次我做,一个方法抛出一个奇怪的“预期types”的错误。 我在头上有一个方法:
-(ANObject *)generateSomethingForSomethingElse:(NSString *)somethingElse;
这个方法的返回types的错误点。 我已经使用#import "ANObject.h"
ANObject
导入ANObject
和ANObject
编译罚款..
为什么发生这种情况?
这与编译源文件的顺序有关。您可能已经知道,在定义之前,您不能调用方法(请参阅下面的伪代码):
var value = someMethod(); function someMethod() { ... }
这会导致编译时错误,因为someMethod()尚未定义。 类也是如此。 类由编译器一个接一个地编译。
所以,如果你想象所有的类在编译之前被放到一个巨大的文件中,你可能已经看到了这个问题。 我们来看看Ship
and BoatYard
类:
@interface BoatYard : NSObject @property (nonatomic, retain) Ship* currentShip; @end @interface Ship : NSObject @property (nonatomic, retain) NSString* name; @property (nonatomic, assign) float weight; @end
再一次,因为Ship
类尚未定义,我们现在还不能参考。 解决这个问题非常简单, 改变编译顺序并编译。 我敢肯定,你在XCode这个屏幕上的家庭:
但是你知道你可以在列表中上下拖动文件吗? 这改变了文件将被编译的顺序。因此,只要将Ship
类移动到BoatYard
类之上,并且都是好的。
但是,如果你不想这样做,或者更重要的是,如果两个对象之间存在循环关系呢? 让我们通过添加对Ship
所在的当前BoatYard
的引用来增加该对象图的复杂性:
@interface BoatYard : NSObject @property (nonatomic, retain) Ship* currentShip; @end @interface Ship : NSObject @property (nonatomic, retain) BoatYard* currentBoatYard; @property (nonatomic, retain) NSString* name; @property (nonatomic, assign) float weight; @end
哦,亲爱的,现在我们有一个问题。 这两个不能并行编译。 我们需要一种方法告知编译器Ship *类真的存在。 这就是@class
关键字如此方便的原因。
用外行人的话来说,你是说:“相信我吧, Ship
真的存在,你会很快看到它的。 把它放在一起:
@class Ship; @interface BoatYard : NSObject @property (nonatomic, retain) Ship* currentShip; @end @interface Ship : NSObject @property (nonatomic, retain) BoatYard* currentBoatYard; @property (nonatomic, retain) NSString* name; @property (nonatomic, assign) float weight; @end
现在编译器知道编译了BoatYard
, Ship
类的定义很快就会出现。 当然,如果没有,汇编仍然会成功。
所有的@class
关键字不过是通知编译器,类很快就会出现。 它不是 #import
的替代品。 您仍然必须导入头文件,否则您将无法访问任何类内部:
@class Ship -(void) example { Ship* newShip = [[Ship alloc] init]; }
这不能工作,并会失败,并显示Ship是前向声明。 一旦你#import "Ship.h"
,那么你将能够创build对象的实例。
我发现这个错误发生在头部有循环依赖的时候。 检查声明此方法的.h文件是否在ANObject.h中导入
你基本上添加
@class ANObject;
在@interface之前!
所以,出于某种原因,我试图在参数中设置一个枚举types的方法时出现这个错误。 像这样:
- (void)foo:(MyEnumVariable)enumVariable;
我以前曾经这样使用,从来没有问题,但现在我做了。 我检查了循环依赖,并且找不到任何东西。 我也多次检查错别字,没有骰子。 最终解决我的问题是在我想访问variables之前添加“枚举”。 像这样:
- (void)foo:(enum MyEnumVariable)enumVariable; { enum MyEnumVariable anotherEnumVariable; }
通常当我看到这样的错误时,这是因为我在上一行有一个错字,例如一个额外的或缺less的括号或其他东西。
这可能听起来很愚蠢,但错误的使用大写/小写字母错误的shell或错误的情况下。
我得到这个消息,当variablestypes拼写错误。 见下面这个下面
例如
-(void)takeSimulatorSafePhotoWithPopoverFrame:(GCRect)popoverFrame {
代替…..
-(void)takeSimulatorSafePhotoWithPopoverFrame:(CGRect)popoverFrame {
奇怪的是,改变我的import顺序已经解决了这个问题…尝试移动导入到所有其他import后的底部。
- Visual Studio 2005编译时间非常慢
- 为什么我得到编译错误“org / codehaus / groovy / control / CompilationFailedException”?
- 如何在Windows或Linux下编译Qt 5,32或64位,VS2010,VS2012,VS2013或VS2015 Express或g ++上的静态或dynamic
- 疑难解答“程序不包含一个静态的”主要“方法”,当它明确…?
- 为什么我debuggingASP.NET MVC应用程序时,Application_Start()事件不会启动?
- 为什么在编译x86_64上的静态库时,gcc不会隐式提供-fPIC标志
- 编译Python解释器静态?
- 为什么不JVM编译代码的JVMcaching?
- 斯卡拉双重定义(2种方法有相同types的删除)