ios - 导入 UIKit 而不是特定的 UIKit 组件是否有任何性能/编译时间优势?

标签 ios objective-c import frameworks

例如我有以下界面。

#import<UIKit/UIKit.h>

@interface someClass : NSObject
@property (nonatomic, copy) NSString *string;
@property (nonatomic, copy) UIFont *font;
@end

我觉得我们没有必要导入整个 UIKit。我不确定下面是否会比上面更好。

#import<Foundation/Foundation.h>
#import<UIKit/UIFont.h>

@interface someClass: NSObject
@property (nonatomic, copy) NSString *string;
@property (nonatomic, copy) UIFont *font;
@end

我认为通过只导入 UIKit 我可以避免不需要列出所有其他需要的框架。但是这样做有什么真正的优势/劣势吗?此外,如果我不使用#import,而是使用@import 模块,那么在这个特定示例中会有什么不同。

最佳答案

理论上,是的。这就是 C 和 Objective-C header 的设计方式。你应该只导入你需要的组件,因为这对编译器来说工作更少,因此编译时间更快。如果您查看 Apple 框架,它们通常是这样工作的(每个 header 仅导入它使用的组件)。

在实践中,维护您需要的 header 列表将是一项巨大的工作量,而且您几乎看不到任何性能改进。那是因为 UIKit 组件非常紧密地联系在一起,这意味着你的 UIFont.h header 将导入其他 UIKit headers,这些 UIKit header 又会导入其他 headers,等等......而且你最终每次都会导入大部分 UIKit。

正如您所提到的,真正有所作为的是一个名为 Modules 的编译器功能。需要启用(但我相信默认情况下启用它,请在 Xcode build设置中检查 Enable modules)。当您使用模块时,例如 UIKit 模块,编译器会在第一次导入时编译整个模块,然后将其缓存。然后,源文件中同一模块的所有其他导入都将使用此缓存版本,从而大大缩短编译时间。

默认情况下,您将通过执行 @import UIKit; 来导入 UIKit 模块。 , 但编译器也会理解 #import<UIKit/UIKit.h>作为 UIKit 模块的导入(如果启用了模块),因此它将以相同的方式工作。

您还可以使用点符号导入模块的一部分(例如 @import UIKit.UIFont; ),但请记住,这仍会触发整个模块的编译和缓存,因此不要将其视为性能改进。同样,编译器会理解 #import<UIKit/UIFont.h>作为@import UIKit.UIFont; .

综上所述,您的问题的答案是:#import<UIKit/UIKit.h>#import<UIKit/UIFont.h>将导致完全相同的性能影响。你应该使用第一个,因为它更容易,感谢编译器作者,再也不用考虑它了!

关于ios - 导入 UIKit 而不是特定的 UIKit 组件是否有任何性能/编译时间优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44728322/

相关文章:

ios内存管理出来这么乱 : CFGetRetainCount()

ios - 无法将号码添加到 ios 11 中的现有联系人

iphone - UIAnimation - 从 button.frame.origin.y 显示 UIView

ios - 从子类 setDelegate 设置父类(super class)委托(delegate)

iphone Mail App Popup 样式 alertview

ios - 如何识别来自 UITableView 的 UITableViewCell 中多个按钮的点击 - Swift 4

iphone - 您如何使iPhone发出哔哔声?

angular - Angular 2 中模块导入的名称冲突 - 有没有办法防止它

java - 为什么 importStatic Eclipse 模板变量需要命名空间?

javascript - NodeJS导入错误