0

我正在制作一个应用程序,其中视图控制器需要在用户按下主页按钮时关闭 UIAlertView。因此我需要通过应用程序委托来做到这一点。这个视图控制器的类还需要应用程序委托来处理许多其他事情,所以我在它的头文件中有一个#import。到目前为止,我一直在应用程序委托中使用 @class 来做其他事情,但现在我需要一个 #import 以便我可以在视图控制器上调用适当的方法。如何避免#import 循环?还有另一种解决方法吗?

谢谢。

4

4 回答 4

3

除非您确实需要头文件中的完整定义,否则请@class在 .h 文件和#import实际调用该方法的 .m 文件中使用。

您真正需要#import在头文件中使用的唯一一次是导入的头文件定义了您的超类。

于 2013-02-19T23:13:57.807 回答
3

我假设您关心循环的原因是因为您的应用程序委托对您的控制器了解很多,并且您的控制器现在需要在您的应用程序委托上调用一些方法。我不喜欢繁重的应用程序委托,所以我倾向于尽可能多地卸载服务和实用程序类。如果应用程序委托绝对必须做某事,则创建一个单例服务类,并让您的应用程序委托将自己设置为该服务的委托(当然是通过协议)。现在您的控制器可以调用此服务来执行通常需要您调用应用程序委托的操作。

另外请记住,您可以使用通知中心来侦听应用程序委托中的许多事件:

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(applicationDidEnterBackground:)
                                                 name:UIApplicationDidEnterBackgroundNotification
                                               object:nil]; 

因此,您可能根本不必与应用程序代表交谈。

于 2013-02-19T23:29:10.157 回答
2

为避免#import 循环,您必须遵循以下示例

假设您有 2 个文件,如下所示

ABC.h ABC.m & XYZ.h XYZ.m

现在您可以在“ABC.h”中导入“XYZ.h”,只需将#import XYZ.h 放在 ABC.h 的顶部即可

但是如果你想在“XYZ.h”中导入“ABC.h”,那么你不能使用“#import”来导入它。这将创建循环。

为了避免这种情况,把@class ABC; 在“XYZ.h”中的@interface XYX 正上方,然后将“#import ABC.h”放入“XYZ.m”中

这将像一个魅力:)

于 2013-02-20T10:30:35.257 回答
0

#import将防止多个包含。所以不用担心。在理想的世界中,只需遵循约定,您将@class在头文件中使用在实现文件中导入所需的类。

于 2013-02-19T23:15:07.560 回答