Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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
Objective-C正向声明与模型层次结构中的导入_Objective C_Cocoa_Import_Forward Declaration - Fatal编程技术网

Objective-C正向声明与模型层次结构中的导入

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

我知道关于@class forward声明和#imports之间的差异,在stackoverflow上有很多问题,我知道这主要是编译器优化和减少循环导入问题

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

// 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