.h文件的标准格式是什么?

时间:2014-05-19 15:32:22

标签: ios objective-c code-organization

我想知道Objective-C接口(.h)文件的标准布局/格式是什么。我知道这个文件中有哪些组件,但我看到它们以多种不同的方式展示。

接口文件的许多组件非常明显,如#import@class等。但对于类似@protocol@interface声明的内容,它可以与众不同。我看到人们在接口声明之上声明了一个新的协议,其实现方法如下:

@protocol MyNewClassDelegate;

@interface MyNewClass : UIViewController

// Properties and Methods

@end

@protocol MyNewClassDelegate <NSObject>

- (void)method

@end

我已经看到的另一种方式是将整个@protocol声明和实现放在@interface语句之上。所以它是这样的:

@protocol MyNewClassDelegate <NSObject>

- (void)method

@end

@interface MyNewClass : UIViewController

//Properties and Methods

@end

我还看到了它在接口上方声明和实现一个协议的设置,而另一个协议也在下面声明和实现。

我的问题是哪个首选或是行业标准?是否有某种方法可以根据其功能的实现来组织它?

3 个答案:

答案 0 :(得分:1)

我不知道我的回答是如何比其他回答更正确,但这是我在大多数应用程序中所做的。

#import 
#import

#define
#define

typedef
typedef

@class ClassName
@class ClassName

@protocol ProtocolName;

@interface Name : inheritedObject <FirstProtocolSupported, SecondProtocolSupported, etc>

@property (noantomic, strong) IBOutlet Object* name;
@property (noantomic, strong) IBOutlet Object* name;
@property (noantomic, strong) IBOutlet Object* name;

@property (nonatomic, strong) Object* name;
@property (nonatomic, strong) Object* name;
@property (nonatomic, strong) Object* name;

- (IBAction)actionName:(SenderObject*)sender;
- (IBAction)actionName:(SenderObject*)sender;
- (IBAction)actionName:(SenderObject*)sender;

- (type)methodName:(Parameter*)argument;
- (type)methodName:(Parameter*)argument;
- (type)methodName:(Parameter*)argument;

@end

@protocol ProtocolName <ProtocolThatIsImplmented>

- (type)protocolMethod:(Param*)parameter;

@end

本质上是,然后是import语句,然后是#define语句,然后是typedef语句,@ class语句,任何协议,然后是类声明,然后是iboutlet属性,然后是普通属性,然后是inaction方法,然后是正常动作,然后是协议声明。

总而言之,没有正确的方法来订购.h文件中的代码,只要一切都被准确宣布,这都是首选问题

答案 1 :(得分:1)

据我所知,编写.h文件没有任何正确(甚至是首选)约定。除非您拥有大量属性和方法(例如Apple的许多基础和UIKit类),否则头文件通常非常短。即使是最笨重的头文件通常也不会超过几百行代码,因此不用担心。

但是,有时您的协议及其类将是相互依赖的。换句话说,协议需要知道类,并且类需要知道协议。

例如,UITableView需要了解协议UITableViewDelegateUITableViewDataSource,因为它定义了必须符合这些协议的属性(即delegate和{{ 1}})。但是,每个协议还需要了解dataSource,因为它们都需要UITableView作为其许多方法的参数(例如UITableView)。

在这种情况下,除非您在numberOfSectionsInTableView:定义之前使用转发@class声明,否则您的第二个示例(在课程之前完整地声明协议)是不够的。您的第一个示例工作,因为您在课程前使用了前向@protocol声明。

答案 2 :(得分:0)

我更喜欢我的协议在他们自己的.h文件中。这样他们就可以轻松地重复使用。

你也不必担心这个命令&#39; #import它的事情。

//Copyright & license
#import 
#import "AProtocol.h"
#import "Typedefs.h"
#import "NeededConsts.h"

@class ClassName;
@class ClassName;

@interface Name : inheritedObject

@property (strong, nonatomic) Object* name;

- (type)methodName:(Parameter*)argument;
- (void)setDelegate:(id <AProtocol>)argument;

@end

在Name.m文件中(我尝试尽可能多地保留.h文件中的信息)

//Copyright & license
#import ...
#import "ProtocolName.h"

file wide typedef
file wide typedef

@class ClassName;
@class ClassName;

static const NSInteger cFileWideInt = 404;

@interface Name () <FirstProtocolSupported, SecondProtocolSupported, etc>

@property (strong, nonatomic) IBOutlet Object* name;
@property (strong, nonatomic) IBOutlet Object* name;
@property (weak,   nonatomic) id<AProtocol> delegate;

@end

@implementation
@end

在.m文件中包含大部分属性和声明的好处在于它提供了“封装”功能。有关您的其他课程不需要了解的信息。这一点导致了代码架构,这将把它变成一个冗长而复杂的答案; P