首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何指定UIApplicationDelegate协议,而只指定UIApplicationDelegate协议?

如何指定UIApplicationDelegate协议,而只指定UIApplicationDelegate协议?
EN

Stack Overflow用户
提问于 2013-12-15 20:51:00
回答 2查看 1.1K关注 0票数 3

Xcode基于模板生成这个头文件:

代码语言:javascript
复制
// this file is XYZAppDelegate.h  
#import <UIKit/UIKit.h>
@interface XYZAppDelegate : UIResponder <UIApplicationDelegate>
....
@end

为了让编译器搞清楚UIApplicationDelegate是什么,这就是它的工作原理?

(1)导入了整个UIKit框架(UIKit.h)。

(2) UIApplication.h是UIKit.h中指定的许多头文件之一。

(3)然后在UIApplication.h中指定UIApplicationDelegate协议。

为了我的理解,我可以写一个:

@interface XYZAppDelegate:UIResponder <direct-reference-to-protocol>

也许吧,就像:

@interface XYZAppDelegate:UIResponder

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-16 07:11:30

要在类上指定协议,编译器需要知道它。唯一做到这一点的方法是指定

代码语言:javascript
复制
@protocol MyProtocol
...
@end

这也适用于类,类别,任何事情。

编译器和任何C编译器一样,逐个文件地处理文件。它能够也不会记得它在运行过程中看到的任何东西。这意味着,为了能够知道MyProtocol是什么,编译器必须在相同的文件中提供与上述相同的协议定义。

因为总是把事情指定一百万次是很烦人的,几十年前C人就知道,如果有预处理指令在指令所在的地方插入一个特定的文件,那就太好了。这是#include出生的时候。

#import#include基本上是一样的,只是它还检查文件以前是否包含过,并且没有像#include那样多次执行。两种方法都只需接受文件,并假装该文件的全部内容都位于指令的位置--仅此而已。

由于C和Objective都没有框架级名称空间,编译器所知道的每个符号都可以而且必须通过指定其名称来使用。您可能从Java (如. )或其他编程语言中知道的名称空间的.语法之类的东西并不存在。

票数 2
EN

Stack Overflow用户

发布于 2013-12-15 21:56:18

你也许想看看这个What is the difference between #import and #include in Objective-C?

当然,你可以

代码语言:javascript
复制
#import <UIKit/UIApplication.h> 
#import <UIKit/UIResponder.h>

而不是

代码语言:javascript
复制
#import <UIKit/UIKit.h>

然而,我可以看到这样的一些缺点。如果苹果会及时将UIApplicationDelegate协议声明移至另一个标头,该怎么办?如果您需要在一些文件中使用10个UIKit类呢?你会写信吗?

代码语言:javascript
复制
#import <UIKit/UIView.h>
#import <UIKit/UIScrollView.h>
#import <UIKit/UIButton.h>
...
#import <UIKit/header_over_9kth.h>

但是,您可以在这里尝试优化导入和编译时间报告。如果您能通过这样的优化获得更多的性能,那将是很有趣的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20599636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档