我知道在stackoverflow上有很多关于@class转发声明和#imports之间的区别的问题--我确实理解这主要是编译器优化和减少循环导入的问题。
我的问题更多的是关于以下情况下的编码风格,例如我有一个如下所示的模型结构。
// 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现在,当我在另一个类中使用它时,如果我想通过访问firstName属性,就需要同时导入Teacher.h和ClassRoom.h
teacherObject.firstName然而,如果我使用#import Teacher.h而不是@class Teacher,我将只需要导入#Teacher。
所以我的主要问题是,这是否是使用导入而不是转发声明的合理时机?我在我的项目中使用的实际模型结构比这个复杂得多,我经常必须在我的实现文件的开头导入5-10个不同的模型类(在控制器中)。虽然这不会伤害任何东西,但它会变得令人沮丧,并使源代码变得更长。我很乐意听到Objective-C老兵对此的意见。
发布于 2014-03-05 22:30:22
我总是像苹果那样做:我“从不”级联导入,但我通常有一个“wrapper h文件”……
就像我有FeatFooA.h FeatFooB.h FeatFooC.h
我还有一个AllFeaturesFoo.h
发布于 2014-03-05 21:46:41
我个人发现在.m文件中显式地显示与#import的依赖关系很好/很方便。
然而,对于应用程序来说是通用的,并且可以在(几乎)所有模块中使用的文件形成了一个例外。
#import所有的泛型头文件;然后在每个#import文件中使用这个单独的头文件,您可以将这个通用#import列表放在AppName-Prefix.pch文件中。(或者甚至执行一个公共标头的#import (见上)。)在这种情况下,您不必对模块中的任何内容执行#import。但我个人不喜欢隐藏/隐含的东西;所以我宁愿选择第一个选项。然后关于您的示例:创建一个School.h可能是有意义的,然后它将是唯一需要的头。如果事物是相互依赖的,因为它都是某个概念的一部分(在这个例子中是“学校”),那么保持界面简单是很好的。我知道这听起来很模糊,但我希望您能明白这一点。
发布于 2014-03-10 03:22:51
据我所知,你的问题是关于代码质量和最佳编码实践的。
IMHO #import更方便,因为你永远不会收到编译器错误“未知的类”。
但有一种情况下,我不推荐使用#import。假设你的应用程序中有几个层。假设是:网络、控制器和视图(GUI)。出于某些原因,您必须从网络层访问GUI类MyProgressView (例如,您正在使用第三方库):
@interface MyNetworkClass : NSObject
@property (strong, nonatomic) MyProgressView *progressView;
@end如果你要使用#import,任何导入MyNetworkClass.h的网络层类都会知道MyProgressView。这与责任分担是相反的!因此,在这种情况下,@class会更好。
https://stackoverflow.com/questions/22199058
复制相似问题