Objective-C正向声明与模型层次结构中的导入
我知道关于@class forward声明和#imports之间的差异,在stackoverflow上有很多问题,我知道这主要是编译器优化和减少循环导入问题 我的问题更多的是关于以下情况下的编码风格,比如说,我有一个如下的模型结构Objective-C正向声明与模型层次结构中的导入,objective-c,cocoa,import,forward-declaration,Objective C,Cocoa,Import,Forward Declaration,我知道关于@class forward声明和#imports之间的差异,在stackoverflow上有很多问题,我知道这主要是编译器优化和减少循环导入问题 我的问题更多的是关于以下情况下的编码风格,比如说,我有一个如下的模型结构 // Classroom.h @class Teacher; @interface ClassRoom : NSObject @property (nonatomic, strong) Teacher *teacher; - (NSArray *)students
// Classroom.h
@class Teacher;
@interface ClassRoom : NSObject
@property (nonatomic, strong) Teacher *teacher;
- (NSArray *)students;
@end
// Teacher.h
@interface Teacher : NSObject
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
@end
现在,当我在另一个类中使用它时,如果我想通过
teacherObject.firstName
如果我用#import Teacher.h代替@class Teacher;我只需要输入老师
所以我的主要问题是,这是否是使用进口而不是远期申报的合理时机?我在项目中使用的实际模型结构要比这复杂得多,我经常需要在实现文件的开始(在控制器中)导入5-10个不同的模型类。虽然这不会损害任何东西,但它确实会让人沮丧,并使源代码变得更长。我很想听听Objective-C退伍军人对此的意见。我个人觉得在
.m
文件中显式显示与#import
s的依赖关系很好/方便
但是,对于应用程序来说是通用的,并且可以在(几乎)所有模块中使用的文件构成了一个例外
#import
s列表放入AppName Prefix.pch
文件中。(或者甚至要导入一个公共标题的#导入
(见上文)。)在这种情况下,您不必导入模块中的任何内容。但我个人不喜欢隐藏/含蓄的东西;所以我宁愿选择第一个选项然后关于您的示例:创建一个
School.h
,这可能是有意义的,它将是唯一需要的标题。如果事物相互依赖,因为它都是某个概念的一部分(本例中为“学校”),最好保持界面简单。我知道这听起来很含糊,但我希望你明白我的意思。我总是像苹果那样做:我“从不”级联导入,但我通常有一个“包装器h文件”
比如当我有FeatFooA.h FeatFooB.h FeatFooC.h我还有一个AllFeaturesFoo.h,因为我知道你的问题是关于代码质量和最佳编码实践的 IMHO
#导入
更方便,因为您永远不会收到编译器错误“未知类”
但有一种情况我不建议使用#import
。假设你的应用程序中有几个层。比如说:网络、控制器和视图(GUI)。出于某些原因,您必须从网络层访问GUI类MyProgressView(例如,您正在使用第三方lib):
如果您将使用
#import
导入MyNetworkClass.h的任何网络层类,则还将了解MyProgressView。这与责任分担背道而驰!所以在这种情况下,@class
会更好。一个伞形头,我想,但找不到支持我的视频,制作这些预编译头(.pch)也会在编译时提高性能。这些根本不是pch。你不应该只依赖pchs。虽然它们提高了性能,将它们添加到pch中可能是有意义的pch确实提高了性能,但会使整个系统更加脆弱。谷歌搜索pchs的优点/缺点以获取@Avt的可能副本谢谢你的链接。我在搜索StackOverflow.com时确实发现了这个问题(还有更多问题),但这并不是我要问的。我更好奇的是,在深层模型层次结构中使用#导入是否是一种好的做法,以防止在使用该模型的所有控制器类中出现数十行导入。非常感谢。
@interface MyNetworkClass : NSObject
@property (strong, nonatomic) MyProgressView *progressView;
@end