关于.h和.m文件(如何管理)

时间:2013-04-25 14:51:45

标签: ios objective-c

嘿,有经验的程序员!

我想问你一些关于干净代码的事情:)

我想保持我的代码干净并使其更好,所以这就是我的问题:

1)我应该把#imports放在哪里? 我的原则:(我不认为它们很好)

  • #import框架应始终位于.h
  • #import .h文件应始终位于.m
  • .h文件应该只有@class,而不是导入(不包括UIKit之类的框架等)
  • 代表应该在.m

    @interface ViewController() <UIAlertViewDelegate> 
    @end
    

2)我应该把我的实例变量放在哪里?

  • 私有和受保护的变量必须位于.m
  • 公众必须在.h

3)我应该把我的方法放在哪里?

  • Public in .h
  • 私人在.m (是的,我知道我的&#34;私人方法&#34;不是真的私密,只是隐藏)

(顺便说一下非常明显)

4)#define?

怎么样?
  • 全球 - 永远在.h
  • 仅在该课程中使用 - 始终使用.m

5)我应该在哪里放置NSNotification全局标识符以及如何组织它们

  • #define NSNotificationDataSourceDidLoadData @&#34; NSNotificationDataSourceDidLoadData&#34;在将发送此通知的类中的.h文件中

但是......

  • Apple在.h文件中有很多私人内容。
  • 在大多数情况下,我的.h文件只是..空的:)

一年前,我又遇到了另一种情况 - 一切都在.h,但我认为这也很糟糕

怎么办?你使用什么原则? 谢谢!

这是关于编码风格的问题,而不是关于如何使其可编辑的问题&#34;

3 个答案:

答案 0 :(得分:5)

我是这样做的:

  • 通常的#import <Foundation/Foundation.h>#import <UIKit/UIKit.h>会进入.pch文件。没有标题或实现文件再次执行这些导入(使iOS和Mac OS X之间的共享代码更容易一些)。
  • 在.h文件中:
    • 只有绝对必要时才会导入其他.h文件,例如因为它们定义的类型不同于类(枚举,结构,带有typedef的所有内容),然后在当前.h文件中使用。
    • 向前声明类(@class Foo;)以避免引入其他.h文件。
    • 接口只包含其他类可以访问的内容!这里没有私人物品!
  • 在.m文件中:
    • 包含您需要的所有.h文件。但不是更多; - )
    • 私有实例变量和属性在类扩展(@interface Foo ())中定义。
    • 私人方法不再需要“向前宣布”,所以不要这样做。

在极少数情况下,类有一些类应该访问但是“普通”用户不应该访问的东西,我创建了foo_protected.h标题,其类别类别定义了“受保护”方法。 / p>

关于#define的一句话:尽可能避免使用它们。如果可能,请使用const变量或enum,因为附加类型信息可以帮助编译器以这种方式捕获更多错误。例如,使用enum s具有很好的优势,如果您有switch但未处理enum的所有值,则会收到警告。如果你添加一个新值,你会在忘记处理它们的任何地方收到警告,这是#define未得到的。

答案 1 :(得分:3)

就个人而言,我认为答案很简单。现在可以在@implementation中声明实例变量,并且可以在 .m 文件的类扩展中声明属性和协议采用,我不会将 .h 文件中的任何,我绝不会将 放在那里。

答案 2 :(得分:2)

  

导入框架应始终位于.h

不,为什么?

  

导入.h文件应始终位于.m

这很模糊。如果你需要在头文件中导入一些东西怎么办?你想要一个类的子类,你做什么?标题中为#import "SomeClass.h"

  

.h文件应该只有@class,而不是导入(不包括UIKit之类的框架等)

愚笨。 (对不起,确实如此。请参阅上面的推理。)

  

2)我应该把我的实例变量放在哪里?

由于其他类实际上不应该访问ivars(即建议不要制作你的ivars public),你可以将它们放在任何地方:标题很好(并且它对于与v1的兼容性很有用) .0脆弱的运行时API),但你也可以放弃在类扩展中放置所有东西。

  

3)我应该把我的方法放在哪里?

你有这个,非常好。

  

4)#define?

怎么样?

就我而言,这也很好。基本上,将定义和枚举放在需要显示的位置。

  

Apple在.h文件中有很多私有内容   在大多数情况下,我的.h文件只是..空的:)

嗯,即便是苹果公司的风格也不太一致。保持一致。

空标题?如果您不需要标题,请不要使用标题。使用标头为您的类,函数和类型声明提供接口。