在Objective-C中,合理设计头文件(.h)和实现文件(.m)是封装的关键,遵循以下规范:

头文件(.h)应暴露的内容(公共接口)

  1. 类声明
    @interface MyClass : NSObject
    

  2. 公开属性
    使用@property声明外部可访问的属性:
    @property (nonatomic, copy) NSString *publicName;
    

  3. 公开方法
    需被其他类调用的方法:
    - (void)publicMethod;
    + (instancetype)sharedInstance;
    

  4. 公开协议遵循
    若类需作为代理或数据源:
    @interface MyClass : NSObject <UITableViewDelegate>
    

  5. 公开常量
    外部需使用的常量:
    extern NSString *const MyPublicNotification;
    

实现文件(.m)应隐藏的内容(私有实现)

  1. 私有属性
    在类扩展中声明(.m文件顶部):
    @interface MyClass ()
    @property (nonatomic, strong) NSArray *privateData;
    @end
    

  2. 私有方法
    不在头文件声明,直接实现:
    - (void)_privateHelperMethod { /*...*/ }
    

  3. 内部常量
    static const限定作用域:
    static const NSInteger kMaxRetryCount = 3;
    

  4. 私有协议遵循
    仅在实现文件声明:
    @interface MyClass () <NSCacheDelegate>
    @end
    

  5. 实例变量
    优先使用属性,特殊需求时用@synthesize在.m中管理:
    @synthesize internalState = _internalState;
    

关键设计原则

  1. 最小暴露原则
    头文件内容越少越好,减少编译依赖。例如用@class前置声明替代#import
    // .h文件中
    @class DependentClass;  // 代替 #import "DependentClass.h"
    

  2. 封装性保障
    所有内部状态(如_privateVariable)禁止在头文件出现。
  3. 常量可见性控制
    • 公开常量:.h中用extern声明,.m中定义
    • 私有常量:.m中用static const定义
  4. 方法命名规范
    私有方法建议加前缀(如_p_)避免冲突:
    - (void)p_internalCleanup {}
    

示例对比

头文件(MyClass.h)
// 只暴露必要内容
@interface MyClass : NSObject
@property (nonatomic, readonly) NSInteger state;
- (void)publicAPI;
@end

实现文件(MyClass.m)
// 隐藏实现细节
@interface MyClass () <NSCoding>
@property (nonatomic, strong) id internalData;
@end

@implementation MyClass {
    NSString *_privateVar; // 私有实例变量
}

static NSString *const kInternalKey = @"secret";

- (void)publicAPI { 
    [self _privateHelper]; 
}

- (void)_privateHelper { /*...*/ } // 私有方法
@end

重要提示:通过@property (readonly)控制写权限,利用类扩展重新声明为readwrite(在.m中),这是实现"公有只读,私有可写"的标准模式。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐