我正在创建一个应用程序,当用户按下主页按钮时,视图控制器需要关闭UIAlertView。因此,我需要通过app委托执行此操作。这个视图控制器的类还需要许多其他东西的app委托,所以我的头文件中有一个#import。到目前为止,我一直在app delegate中使用@class用于其他东西,但现在我需要一个#import,以便我可以在视图控制器上调用适当的方法。如何避免#import循环?还有另一种方法可以解决这个问题吗?
感谢。
答案 0 :(得分:3)
除非您确实需要标头中的完整定义,否则请使用.h文件中的@class
和实际调用该方法的.m文件中的#import
。
如果导入的标头定义了您的超类,那么您真正需要在头文件中使用#import
的唯一时间。
答案 1 :(得分:3)
我假设你关注循环的原因是因为你的app委托知道很多关于你的控制器,你的控制器现在需要在你的app委托上调用一些方法。我不喜欢有一个沉重的应用程序委托,所以我倾向于尽可能多地卸载到服务和实用程序类。如果app委托绝对必须做某事,那么创建一个单例服务类,并让你的app委托将自己设置为该服务的委托(当然是通过协议)。现在,您的控制器可以调用此服务来执行通常需要您调用应用程序委托的操作。
另请注意,您可以使用通知中心收听应用代理中的许多活动:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidEnterBackground:)
name:UIApplicationDidEnterBackgroundNotification
object:nil];
因此,您可能根本不需要与应用代表交谈。
答案 2 :(得分:2)
要避免#import循环,您必须遵循以下示例
假设您有2个文件,如下所示
ABC.h ABC.m &安培; XYZ.h XYZ.m
现在您可以导入" XYZ.h" in" ABC.h"只需将#import XYZ.h放在ABC.h的顶部
即可但是如果你想导入" ABC.h"在" XYZ.h"那么你不能使用" #import"来导入它。这将创建循环。
为了避免这种情况,请输入@class ABC;位于" XYZ.h"中的@interface XYX正上方然后把###; #import ABC.h"在" XYZ.m"
这将像魅力一样:)
答案 3 :(得分:0)
#import
将防范多个包含。所以不用担心。在理想的世界中,只需遵循惯例,您就可以在头文件中使用@class
导入实现文件中所需的类。