0

我收到运行时错误作为类应用程序委托的重复接口定义。那么这段代码有什么问题。

#import <UIKit/UIKit.h>

@class ViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) ViewController *viewController;

@end
4

2 回答 2

0

我刚刚遇到了这个问题。

我所做的是拖放具有#import AppDelegate来自另一个项目的文件,该项目也包含确切命名的 AppDelegate.h/.m 类。当我将文件放到我的项目中时,我从该项目中引用它们而不是复制它们。

通过这样做,这些文件与要导入的 AppDelegate 发生冲突,并且我收到一个编译错误,提示“类 AppDelegate 的接口定义重复。

我通过删除引用并按预期复制文件解决了这个问题。这可能不是您的问题,因为您遇到了运行时错误,但只是提醒一下。

于 2013-02-08T11:30:13.003 回答
0

在头文件状态的开头:

#if !defined APPDELEGATE_H
#define APPDELEGATE_H

并在结束状态:

#endif

此错误最可能的根本原因是您在某些类头文件和 .m 文件中包含了 AppDelegate.h。在编译 .m 文件时,会包含相应的 .h 文件(可能还包含其他一些 .h 文件)。在任何这些 .h 文件中都包含 AppDelegate.h。另外,您将其包含在 .m 文件中。从编译器的角度来看,这将导致接口的重复定义。上面的解决方案并不是真正的解决方案。严格来说,这是一种解决方法。但它是相当标准的,苹果在他们的所有模板中都使用它。这只是一种解决方法,因为它不能解决问题,而是处理它。

正确的解决方案是:如果可以避免,在 .h 文件中不要包含其他 .h 文件。在适当的地方使用@class声明。当 .h 文件已包含在任何其他包含的 .h 文件中时,切勿在 .m 文件中重复包含任何 .h 文件。您可能会认为“这是一个痛苦的......”。你是对的 :) 因此我建议使用通用#if !defined XY_H / #define XY_H / #endif模式,尽管我相信这只是一种解决方法。

#if !defined APPDELEGATE_H
#define APPDELEGATE_H
#import <UIKit/UIKit.h>

@class ViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) ViewController *viewController;

@end
#endif
于 2013-02-08T10:20:36.733 回答