首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Objective-C转发声明与模型层次结构中的#import

Objective-C转发声明与模型层次结构中的#import
EN

Stack Overflow用户
提问于 2014-03-05 21:23:32
回答 3查看 390关注 0票数 2

我知道在stackoverflow上有很多关于@class转发声明和#imports之间的区别的问题--我确实理解这主要是编译器优化和减少循环导入的问题。

我的问题更多的是关于以下情况下的编码风格,例如我有一个如下所示的模型结构。

代码语言:javascript
复制
// 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

代码语言:javascript
复制
teacherObject.firstName

然而,如果我使用#import Teacher.h而不是@class Teacher,我将只需要导入#Teacher。

所以我的主要问题是,这是否是使用导入而不是转发声明的合理时机?我在我的项目中使用的实际模型结构比这个复杂得多,我经常必须在我的实现文件的开头导入5-10个不同的模型类(在控制器中)。虽然这不会伤害任何东西,但它会变得令人沮丧,并使源代码变得更长。我很乐意听到Objective-C老兵对此的意见。

EN

回答 3

Stack Overflow用户

发布于 2014-03-05 22:30:22

我总是像苹果那样做:我“从不”级联导入,但我通常有一个“wrapper h文件”……

就像我有FeatFooA.h FeatFooB.h FeatFooC.h

我还有一个AllFeaturesFoo.h

票数 2
EN

Stack Overflow用户

发布于 2014-03-05 21:46:41

我个人发现在.m文件中显式地显示与#import的依赖关系很好/很方便。

然而,对于应用程序来说是通用的,并且可以在(几乎)所有模块中使用的文件形成了一个例外。

  1. 在这种情况下,您可以使用一个公共的头文件,其中#import所有的泛型头文件;然后在每个#import文件中使用这个单独的头文件,您可以将这个通用#import列表放在AppName-Prefix.pch文件中。(或者甚至执行一个公共标头的#import (见上)。)在这种情况下,您不必对模块中的任何内容执行#import。但我个人不喜欢隐藏/隐含的东西;所以我宁愿选择第一个选项。

然后关于您的示例:创建一个School.h可能是有意义的,然后它将是唯一需要的头。如果事物是相互依赖的,因为它都是某个概念的一部分(在这个例子中是“学校”),那么保持界面简单是很好的。我知道这听起来很模糊,但我希望您能明白这一点。

票数 1
EN

Stack Overflow用户

发布于 2014-03-10 03:22:51

据我所知,你的问题是关于代码质量和最佳编码实践的。

IMHO #import更方便,因为你永远不会收到编译器错误“未知的类”。

但有一种情况下,我不推荐使用#import。假设你的应用程序中有几个层。假设是:网络、控制器和视图(GUI)。出于某些原因,您必须从网络层访问GUI类MyProgressView (例如,您正在使用第三方库):

代码语言:javascript
复制
@interface MyNetworkClass : NSObject
@property (strong, nonatomic) MyProgressView *progressView;
@end

如果你要使用#import,任何导入MyNetworkClass.h的网络层类都会知道MyProgressView。这与责任分担是相反的!因此,在这种情况下,@class会更好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22199058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档