Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 导入UIKit而不是特定的UIKit组件是否有任何性能/编译时优势?_Ios_Objective C_Import_Frameworks - Fatal编程技术网

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
将产生完全相同的性能影响。您应该使用第一个,因为它更简单,感谢编译器的作者,不要再想它了