一般来说,Extension用来给Class增加私有属性和方法,写在 Class 的.m文件。但是Extension不是必须要写在.m文件,你可以写在任何地方,只要在 @implementation 前定义就可以。所以我们可以利用这个特性实现属性隐藏。

Case: 模块内部需要访问某属性,模块外需隐藏。这种情况经常会遇到。例如对于某一公司来讲,每个员工都需要员工ID来唯一标识,但是员工作为自然人,在其他地方,别人不需要知道这个ID。所以对于该员工的ID,在公司内部需要访问,在外部需要隐藏。

定义一个company对象,一个person对象。

@interface Person : NSObject

@property (nonatomic, strong) NSString *name;

@end
@interface Company : NSObject

@property (nonatomic, strong) NSString *name;

- (void)addStaff:(Person *)person;

- (void)printAllStaffDisplayName;

@end

公司可以增加一个自然人当自己的员工。可以打印全部员工ID,

@interface Company ()

@property (nonatomic, strong) NSMutableArray<Person *> *staffs;

@end

@implementation Company

- (void)addStaff:(Person *)person {
person.companyID = [NSString stringWithFormat:@"大汉%ld",self.staffs.count];
[self.staffs addObject:person];
} - (void)printAllStaffDisplayName {
for (Person *staff in self.staffs) {
NSLog(@"name:%@ displayName:%@ \n",staff.name,staff.companyID);
}
} - (NSMutableArray<Person *> *)staffs {
if (!_staffs) {
_staffs = [NSMutableArray arrayWithCapacity:];
}
return _staffs;
} @end

可以看到在 Company 中需要访问 Person 的 companyID,所以我们给 Person 增加一个 Extention。写在 Company.h。

@interface Company : NSObject

@property (nonatomic, strong) NSString *name;

- (void)addStaff:(Person *)person;

- (void)printAllStaffCompanyID;

@end

@interface Person ()

@property (nonatomic, strong) NSString *companyID;

@end

这样我们就可以在模块内部增加了一个public属性,而模块外部不知道有这个属性。

    Company *cisco = [Company new];
cisco.name = @"cisco"; Person *tao = [Person new];
tao.name = @"涛"; [cisco addStaff:tao];
[cisco printAllStaffDisplayName];

关于这个特性,可以参考sunny的文章:http://blog.sunnyxx.com/2016/04/22/objc-class-extension-tips/。但是,当你运行的时候会发现,crash了!log显示找不到setCompanyID方法,原来我们把extention写在非.m文件的时候,oc不会帮我们自动生成set,get方法。我想手动写一个set方法来解决这个问题,发现如果想在 @implenmatation 写,就必须知道他的实例变量 _companyID,我们现在拿不到。联想到readOnly属性可以使用 extention 在.m中修改为readWrite:

.h

@interface Person : NSObject

@property (readonly, nonatomic, strong) NSString *gender;

@end

.m

@interface Person ()

@property (nonatomic, strong) NSString *gender;

@end

@implementation Person

@end

那我们也可以在 Person.m 中再次申明一个companyID的私有属性。这样,oc会帮我们自动生成set,get方法。试验一下,完美!

@interface Person ()

@property (nonatomic, strong) NSString *companyID;

@end

@implementation Person

@end

Demo下载

巧用 Class Extension 隐藏属性的更多相关文章

  1. Dos命令的巧用 - 转载

    Dos命令的巧用 豪华绚丽的Windows让人们把DOS抛到遥远的记忆角落,然而,真正有价值的东西不会轻易退出历史的舞台.很多人都已经习惯于 Windows的图形化用户界面,熟不知古老的DOS命令却可 ...

  2. 完美实现保存和加载easyui datagrid自定义调整列宽位置隐藏属性功能

    需求&场景 例表查询是业务系统中使用最多也是最基础功能,但也是调整最平凡,不同的用户对数据的要求也不一样,所以在系统正式使用后,做为开发恨不得坐在业务边上,根据他们的要求进行调整,需要调整最多 ...

  3. 152-技巧-Power Query 快速合并文件夹中表格之自定义函数 TableXlsxCsv

    152-技巧-Power Query 快速合并文件夹中表格之自定义函数 TableXlsxCsv 附件下载地址:https://jiaopengzi.com/2602.html 一.背景 在我们使用 ...

  4. Windbg Extension NetExt 使用指南 【2】 ---- NetExt 的基本命令介绍

    摘要 : 本章节介绍NetExt常用的命令. 并且对SOS进行一些对比. NetExt的帮助 要想玩好NetExt, 入门就得看帮助. 看NetExt的帮助可以调用!whelp 命令. 这样hi列举出 ...

  5. Windbg Extension NetExt 使用指南 【1】 ---- NetExt 介绍

    摘要 : 在使用WINDBG做debugging的时候,需要一个好的工具帮助进行数据分析. 最常见的extension包括SOS, PSSCOR.  NetExt则是另外一种提供了丰富命令功能的deb ...

  6. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  7. PHPmailer关于Extension missing: openssl报错的解决

    最近在写一个网页的时候,需要用到PHPmailer来发送邮件,按照官网上给出的demo写出一个例子,却报错Extension missing: openssl 最后发现需要修改php.ini中的配置: ...

  8. [MySQL性能优化系列]巧用索引

    1. 普通青年的索引使用方式 假设我们有一个用户表 tb_user,内容如下: name age sex jack 22 男 rose 21 女 tom 20 男 ... ... ... 执行SQL语 ...

  9. 研究Extension和Category的一个例子

    Category: 1. 无法添加实例变量 2.将类的实现分散到多个不同文件或多个不同框架中. Extension: 1. 可以添加实例变量 注: 如果Category的头文件中也使用Extensio ...

随机推荐

  1. BZOJ 3925: [Zjoi2015] 地震后的幻想乡(概率DP)

    这里有一篇很好很强的博客%%% YouSiki大佬的博客 多理解一会就行了- 代码 #include <bits/stdc++.h> using namespace std; typede ...

  2. Springboot注解@ServletComponentScan和@ComponentScan(转)

    一.SpringBoot中使用Servlet在SpringBootApplication上使用@ServletComponentScan注解后,Servlet.Filter.Listener可以直接通 ...

  3. 浏览器顶部设置margin-top时存在的bug

    浏览器bug<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8 ...

  4. 005_STM32程序移植之_RC522读卡模块

    1. 测试环境:STM32C8T6 2. 测试模块:RC522读卡模块 3. 测试接口: RC522读卡模块: VCC------------------3.3V GND--------------- ...

  5. 开源分布式中间件 DBLE 快速入门指南

    GitHub:https://github.com/actiontech/dble 官方中文文档:https://actiontech.github.io/dble-docs-cn/ 一.环境准备 D ...

  6. 047_批量下载有序文件(pdf、图片、视频等等)

    #!/bin/bash#本脚本准备有序的网络资料进行批量下载操作(如 01.jpg,02.jpg,03.jpg)#设置资源来源的域名连接 url="http://www.test.com/& ...

  7. web批量下载文件到本地

    JavaWeb 文件下载功能 文件下载的实质就是文件拷贝,将文件从服务器端拷贝到浏览器端,所以文件下载需要IO技术将服务器端的文件读取到,然后写到response缓冲区中,然后再下载到个人客户端. 1 ...

  8. webuploader+文件夹上传

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...

  9. vue 中 v-model

    一.v-model: 先上段简单的 vue 代码: // 定义 v-model 示例组件 Vue.component('bindData', { template:` <div> < ...

  10. 【概率论】4-2:期望的性质(Properties of Expectation)

    title: [概率论]4-2:期望的性质(Properties of Expectation) categories: - Mathematic - Probability keywords: - ...