规范 Objective-C 类的头文件与实现文件:哪些内容该暴露,哪些该隐藏?
·
在Objective-C中,合理设计头文件(.h)和实现文件(.m)是封装的关键,遵循以下规范:
头文件(.h)应暴露的内容(公共接口)
- 类声明
@interface MyClass : NSObject - 公开属性
使用@property声明外部可访问的属性:@property (nonatomic, copy) NSString *publicName; - 公开方法
需被其他类调用的方法:- (void)publicMethod; + (instancetype)sharedInstance; - 公开协议遵循
若类需作为代理或数据源:@interface MyClass : NSObject <UITableViewDelegate> - 公开常量
外部需使用的常量:extern NSString *const MyPublicNotification;
实现文件(.m)应隐藏的内容(私有实现)
- 私有属性
在类扩展中声明(.m文件顶部):@interface MyClass () @property (nonatomic, strong) NSArray *privateData; @end - 私有方法
不在头文件声明,直接实现:- (void)_privateHelperMethod { /*...*/ } - 内部常量
用static const限定作用域:static const NSInteger kMaxRetryCount = 3; - 私有协议遵循
仅在实现文件声明:@interface MyClass () <NSCacheDelegate> @end - 实例变量
优先使用属性,特殊需求时用@synthesize在.m中管理:@synthesize internalState = _internalState;
关键设计原则
- 最小暴露原则
头文件内容越少越好,减少编译依赖。例如用@class前置声明替代#import:// .h文件中 @class DependentClass; // 代替 #import "DependentClass.h" - 封装性保障
所有内部状态(如_privateVariable)禁止在头文件出现。 - 常量可见性控制
- 公开常量:
.h中用extern声明,.m中定义 - 私有常量:
.m中用static const定义
- 公开常量:
- 方法命名规范
私有方法建议加前缀(如_或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中),这是实现"公有只读,私有可写"的标准模式。
更多推荐
所有评论(0)