繁体   English   中英

为Objective-C / XCode组织#import语句

[英]Organize #import Statements for Objective-C/XCode

在Objective-C中进行了几个月的编码后,我完全理解何时需要#import ,import语句如何级联(ripple?),以及何时使用转发类。 知道如何聚合导入以将它们置于<>而不是引号中(尽管这可能仅适用于框架)...

问题是我弄得一团糟。 我来自Java(以及苛刻的IDE),所以我只是添加我认为合适的导入。 有时我会将它们添加到界面中,但由于这通常不是必需的,我只是将它们添加到有问题的.m的顶部。

今天我开始思考:必须有一些关于如何组织这些东西的经验法则。 事实上,由于Objective-C是一个C超集,所以一切都有经验法则,但我不知道它们。 我该如何组织进口? 尤其:

  • 我什么时候应该导入.m
  • 我什么时候应该导入.h
  • 我应该创建.h文件只是为了导入它们(即,只有导入的头文件)? 如果是这样,任何有关组织的提示?

这只是我想弄清楚的一般概念。

<....>语法确实只适用于框架。 这并不意味着您不应该创建一个框架来包含应用程序的核心逻辑。 如果你这样做,这通常很有用:

a)需要为想要调用应用程序逻辑方面的可加载bundle提供支持(bundle链接到框架,应用程序也是如此)b)编写共享相同核心逻辑的多个应用程序

你的问题有点主观,你会得到两种方式争论的开发者,但我遵循的惯例是:

  1. 永远不要在.h文件中导入类定义, 除非你是它的子类 .h所有内容使用forward @class指令。
  2. 只有在您发现需要在实现中使用该类时才将类定义导入.m

一般来说, .h不需要访问其ivars,方法参数或返回值的类定义。 它只需要知道它们是类,这是@class允许你做的。 确实需要访问您正在进行子类化的任何类的定义,添加类别或(显然)实现协议。

忘记<...>是否适用于框架或什么。 <...>检查系统标题搜索路径,而"..."除了检查当前目录。 但要记住的一件事是,在Apple平台上, <CoreFoo/CoreFoo.h>声明的处理方式略有不同,但仅与苹果框架有关: CoreFoo.framework/Headers/CoreFoo.hCoreFoo/CoreFoo.h匹配CoreFoo/CoreFoo.h

当导入在<>而不是引号内时,所有这些意味着您要从框架中导入内容。 事实上,在执行此操作时,导入通常是样式

#import <Foundation/Foundation.h>

在斜杠之前的第一个Foundation是所讨论的框架的名称,第二个基础是该框架中的头文件。 那个头文件就是这样的

#import <Foundation/NSObjCRuntime.h>
#import <Foundation/NSArray.h>
#import <Foundation/NSAutoreleasePool.h>
...
#import <Foundation/NSURLHandle.h>

包括该框架中的每个文件。 您也可以这样做,对于需要多次导入的组件来说并不是一个坏主意(尽管在这种情况下,您可能需要一个单独的公共接口)

对于其他的东西,遵循经验法则,你希望东西尽可能少地知道,你只想把导入放在头文件中,如果有必要的话(比如ivar或超类),但实际上它是一个问题味道。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM