iOS 中 Class-continuation 的使用

来源:互联网 发布:淘宝女装店铺名字潮 编辑:程序博客网 时间:2024/05/16 18:06

Objective-C 动态消息系统的工作方式 决定了 其 不可能实现真正的私有方法或者私有变量。 因为我们在运行时的时候都可以提取 出来。 但是 即使如此 ,我们最好只把确实需要对外公布的那部分内容公开,这种 不需要对外公布的 就使用 class-continuation 来实现。 笔者 总结有 四种场景下使用。尤其是在写 SDK 等情况下 一种 隐藏你不想被外部知道的类 二种情况: 使用 了Objective-C++ 混编的类但是 不想改变头文件 第三种情况 public 接口声明中 只读的 属性拓展为 “可读写 ”  第四种:隐藏 内部遵守的 协议。下面我们分别来介绍这四种情形。

第一种 场景:隐藏你不想被外部知道的类

通常 我们会这样写:

#import <Foundation/Foundation.h>


@class EOCSuperSecretClass;


@interface EOCClass : NSObject

{

    // 即使声明为 private 放在公共 接口中的EOCClass依然会让外部知道有

    // EOCSuperSecretClass这样的类存在 而这不是我们想要的

    @private

    EOCSuperSecretClass *_secretInstance;

}


@end

 对比:

#import "EOCClass.h"

#import "EOCSuperSecretClass.h"


@interface EOCClass ()

{

    // 使用这种方式来隐藏 实现的细节和我们不想给外部知道的 一些类

    EOCSuperSecretClass *_superSecretClass;

}

@end


@implementation EOCClass


@end



第二种场景 使用C++的类 但是不想把 .m 文件改成 .mm 或者 也不想让外部知道里面使用了C++的类


在 EOCClass 的.m 文件中 我们这样实现。

#import "EOCClass.h"

#include "SomeCppClass.h" // 这是我们定义的某个 C++ 的类


@interface EOCClass ()

{

    // 使用这种方式来 隐藏 实现的细节 和我们不想给外部知道的 一些类

   SomeCppClass _someCppClass;

}

@end


@implementation EOCClass


@end


这样 如果我们将代码封装成 SDK 提供给其他程序使用的情况下。 第三方开发者 引入 EOCClass.h 的 xxx.m
文件并不需要 改成 xxx.mm 因为要求第三方将其源文件改成 .mm 不是很合适。注意这里使用了include。 请
对比  class SomeCppClass 引入会产生什么问题?

第三种 场景: public 接口声明中 只读的 属性拓展为 “可读写 ”  

#import <Foundation/Foundation.h>


@interface EOCPerson : NSObject


@property (nonatomic,copy,readonly)NSString *firstName;


@property (nonatomic,copy,readonly)NSString *lastName;

- (instancetype)initWithFirstName:(NSString *)firstName

                         lastName:(NSString *)lastName;


@end


在 .m 文件中

@interface EOCPerson ()


@property (nonatomic,copy,readwrite)NSString *firstName;


@property (nonatomic,copy,readwrite)NSString *lastName;


@end


这样在 类的内部可以 随意的更改其值 但是 在外部 依然是无法改变的。

第四种场景 :隐藏类 内部遵守的协议

#import "EOCPerson.h"

#import "EOCSecretDelegate.h"


@interface EOCPerson ()<EOCSecretDelegate>


@end

@implementation EOCPerson

/* some Code  */

@end













原创粉丝点击