【问题标题】:When do you create initialization methods in .m files using class extension?何时使用类扩展在 .m 文件中创建初始化方法?
【发布时间】:2026-01-18 20:10:02
【问题描述】:

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

突然出现这个:

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

原来“主集合”的初始化出现在 .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
...

【问题讨论】:

    标签: objective-c class-extensions


    【解决方案1】:

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

    -

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

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

    这样的案例有助于说明情况:

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

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

    【讨论】:

    • 感谢您的解释!
    • 只是补充一点,这不是 private 就其他一些语言而言 - 如果我知道(或可以猜到)我可以调用它的方法的名称,没有 Objective-C 方法是私有的。 ..