Ios 导入UIKit而不是特定的UIKit组件是否有任何性能/编译时优势?
例如,我有以下接口Ios 导入UIKit而不是特定的UIKit组件是否有任何性能/编译时优势?,ios,objective-c,import,frameworks,Ios,Objective C,Import,Frameworks,例如,我有以下接口 #import<UIKit/UIKit.h> @interface someClass : NSObject @property (nonatomic, copy) NSString *string; @property (nonatomic, copy) UIFont *font; @end #导入 @接口类:NSObject @属性(非原子,复制)NSString*string; @属性(非原子,复制)UIFont*font; @结束 我觉得我们不必要地
#import<UIKit/UIKit.h>
@interface someClass : NSObject
@property (nonatomic, copy) NSString *string;
@property (nonatomic, copy) UIFont *font;
@end
#导入
@接口类:NSObject
@属性(非原子,复制)NSString*string;
@属性(非原子,复制)UIFont*font;
@结束
我觉得我们不必要地进口整个UIKit。我不确定下面的内容是否比上面的好
#import<Foundation/Foundation.h>
#import<UIKit/UIFont.h>
@interface someClass: NSObject
@property (nonatomic, copy) NSString *string;
@property (nonatomic, copy) UIFont *font;
@end
#导入
#进口
@接口类:NSObject
@属性(非原子,复制)NSString*string;
@属性(非原子,复制)UIFont*font;
@结束
我认为只导入UIKit可以避免列出所有其他需要的框架。但是这样做有什么真正的优点/缺点吗?另外,如果我没有使用#import,而是使用@import模块,那么在这个特定示例中会有任何不同 理论上,是的。这就是C和Objective-C头的设计方式。您应该只导入所需的组件,因为编译器的工作量更少,因此编译时间更快。如果你看看苹果的框架,它们通常就是这样工作的(每个标题只导入它使用的组件) 实际上,要维护所需的标题列表,这将是一项巨大的工作,而且几乎看不到任何性能改进。这是因为UIKit组件非常紧密地联系在一起,这意味着您的
UIFont.h
头将导入其他UIKit头,而这些头又会导入其他头,等等。。。不管怎样,每次都会导入大部分UIKit
正如您所提到的,真正起作用的是一个名为的编译器特性,需要启用它(但我相信它在默认情况下是启用的,请在Xcode构建设置中选中启用模块
)。当您使用模块(例如UIKit模块)时,编译器会在第一次导入时编译整个模块,然后将其缓存。然后,源文件中相同模块的所有其他导入都将使用此缓存版本,这将导致更快的编译时间
默认情况下,您将通过执行@import-UIKit代码>,但编译器也将#import
理解为UIKit模块的导入(如果模块已启用),因此它将以相同的方式工作
您也可以使用点表示法导入部分模块(例如,@import UIKit.UIFont;
),但请记住,这仍然会触发整个模块的编译和缓存,因此不要将其视为性能改进。同样,编译器将#import
理解为@import UIKit.UIFont代码>
综上所述,您的问题的答案是:#import
和#import
将产生完全相同的性能影响。您应该使用第一个,因为它更简单,感谢编译器的作者,不要再想它了 理论上,是的。这就是C和Objective-C头的设计方式。您应该只导入所需的组件,因为编译器的工作量更少,因此编译时间更快。如果你看看苹果的框架,它们通常就是这样工作的(每个标题只导入它使用的组件)
实际上,要维护所需的标题列表,这将是一项巨大的工作,而且几乎看不到任何性能改进。这是因为UIKit组件非常紧密地联系在一起,这意味着您的UIFont.h
头将导入其他UIKit头,而这些头又会导入其他头,等等。。。不管怎样,每次都会导入大部分UIKit
正如您所提到的,真正起作用的是一个名为的编译器特性,需要启用它(但我相信它在默认情况下是启用的,请在Xcode构建设置中选中启用模块
)。当您使用模块(例如UIKit模块)时,编译器会在第一次导入时编译整个模块,然后将其缓存。然后,源文件中相同模块的所有其他导入都将使用此缓存版本,这将导致更快的编译时间
默认情况下,您将通过执行@import-UIKit代码>,但编译器也将#import
理解为UIKit模块的导入(如果模块已启用),因此它将以相同的方式工作
您也可以使用点表示法导入部分模块(例如,@import UIKit.UIFont;
),但请记住,这仍然会触发整个模块的编译和缓存,因此不要将其视为性能改进。同样,编译器将#import
理解为@import UIKit.UIFont代码>
综上所述,您的问题的答案是:#import
和#import
将产生完全相同的性能影响。您应该使用第一个,因为它更简单,感谢编译器的作者,不要再想它了