什么时候使用类扩展在.m文件中创建初始化方法?

时间:2012-04-22 21:33:56

标签: objective-c class-extensions

我正在阅读Apple的一个教程(你的第二个iOS应用程序)。基本上,您有一个主数据类和一个数据控制器类。 Controller类通过创建一个包含它们的数组来操作主数据对象。

突然间出现了这个问题:

“...但是”创建主集合“任务是只有数据控制器对象需要知道的任务。因为这个方法不需要暴露给其他对象,所以你不需要声明它在头文件中。“

事实证明,“。master collection”的初始化作为类扩展而不是头文件出现在.m文件中。我们为什么要这样做?直接在头文件中声明初始化方法有什么问题?

数据控制器的头文件:

#import <Foundation/Foundation.h>

@class BirdSighting;
@interface BirdsSightingDataController : NSObject

@property (nonatomic, copy) NSMutableArray *masterBirdSightingList;
- (NSUInteger)countOfList;
- (BirdSighting *)objectInListAtIndex:(NSUInteger)theIndex;
- (void)addBirdSightingWithName:(NSString *)inputBirdName location:(NSString *)inputLocation;

@end

这是相应的.m文件:

#import "BirdsSightingDataController.h"
#import "BirdSighting.h"

@interface BirdsSightingDataController ()

- (void)initializeDefaultDataList; //class extension

@end

@implementation BirdsSightingDataController
...

1 个答案:

答案 0 :(得分:2)

将方法放在.m文件内的接口中是制作方法hidden的正确方法。

-

在头文件中声明此方法并没有什么“错误”。如果你愿意,你可以这样做。

但是,如果不需要将方法公开,最好使用私有标头扩展来隐藏实现文件中的方法。这意味着如果没有其他类需要调用此方法,或者没有其他程序员需要调用此方法,那么最好将方法保持为私有或隐藏。

这样的案例有助于解释这种情况:

首先,将方法放在.m文件中的隐藏接口扩展中是一个有意识的决定。作为另一个开发人员,如果我正在查看您的代码并且看到您有意识地决定将方法放在实现文件中的隐藏接口()中,我将知道此方法仅在此类中使用...并且你是故意这样做的。

此外,这是一个好习惯,因为如果您正在开发一个将由其他人使用的API,或者与其他开发人员在相同的代码库上工作,那么它限制了他们在类本身之外调用特定方法的能力。这意味着,他们不会意外地从另一个对象调用该方法。