【iOS】小蓝书学习(四)

embedded/2025/2/28 8:04:43/

小蓝书学习(四)

  • 第23条:通过委托与数据源协议进行对象间通信
  • 第24条:将类的实现代码分散到便于管理的数个分类之中
  • 第25条:总是为第三方类的分类名加前缀
  • 第26条:勿在分类中声明属性
  • 第27条:使用“class-continuation分类”隐藏实现细节

第23条:通过委托与数据源协议进行对象间通信

对象之间经常需要相互通信,而通信方式有很多种。OC开发者广泛使用一种名叫委托模式的编程设计模式来实现对象间的通信,该模式的主旨是:定义一套接口,某对象若想要接受另一个对象的委托,则需遵从此接口,以便成为其“委托对象”。而这“另一个对象”则可以给其委托对象回传一些信息,也可以在发生相关事件时通知委托对象

第24条:将类的实现代码分散到便于管理的数个分类之中

类中经常容易填满各种方法,而这些方法的代码则全部堆在一个巨大的实现文件中。在这个情况下,可以通过OC的“分类”机制,把类代码按逻辑划入几个分区中,这对开发与调试都有好处。下面通过个人信息这个类举例说明:

#import <Foundation/Foundation.h>@interface EOCPerson : NSObject
@property (nonatomic, copy, readonly) NSString *firstName;
@property (nonatomic, copy, readonly) NSString *lastName;
@property (nonatomic, strong, readonly) NSArray *friends;- (id)initWithFirstName: (NSString *)firstName andLastName:(NSString *)lastName;/ * Friendship methods * /
- (void) addFriend:(EOCPerson *)person;
- (void) removeFriend:(EOCPerson *)person;
- (BOOL) isFriendsWith:(EOCPerson *)person;/ * Work methods * /
- (void) performDaysWork;
- (void) takeVacationFromWork;/ * Play methods * /
- (void) goToTheCinema;
- (void) goToSportsGame;@end

如果使用分类机制把刚刚的类改成下面这样,将三个分类拆成三个文件:

EOCPerson + Friendship(.h/.m)
EOCPerson + Work(.h/.m)
EOCPerson + Play(.h/.m)

这样一来,我以下面的这个Friendship为例,举例说明一下其中应该怎么实现:

//EOCPerson + Friendship.h
#import "EOCPerson.h"@interface EOCPerson (Friendship)
- (void) addFriend:(EOCPerson *)person;
- (void) removeFriend:(EOCPerson *)person;
- (void) isFriendsWith:(EOCPerson *)person;
@end//EOCPerson + Friendship.m
#import "EOCPerson + Friendship.h"@implementation EOCPerson (Friendship)
- (void) addFriend: (EOCPerson *)person {/* ... */
}
- (void) removeFriend:(EOCPerson *)person {/* ... */
}
- (BOOL) isFriendsWith:(EOCPerson *)person {/* ... */
}
@end

即使类本身不是太大,我们也可以使用分类机制将其切割成几块,并把相应的代码归入不同的功能区中。

要点:

  • 使用分类机制把类的实现代码划分成易于管理的小块。
  • 将应该视为“私有”的方法归入名叫Private的分类中,以隐藏实现的细节。

第25条:总是为第三方类的分类名加前缀

要点:

  • 向第三方类中添加分类,总应给其名称加上你专用的前缀。
  • 想第三方类中添加分类时,总应给其中的方法名加上你专用的前缀。

第26条:勿在分类中声明属性

属性是封装数据的方式。尽管从技术上来看,分类里也可以声明属性,但这种做法还是要尽量避免。原因在于,除了“class-continuation分类”之外,其它分类都无法向类中新增实例变量,故而,它们无法把实现属性所需的实例变量合成出来。

要点:

  • 把封装数据所用的全部属性都定义在主接口里面
  • 在“class- continuation分类”之外的其他分类中,可以定义存取方法,但尽量不要定义属性。

第27条:使用“class-continuation分类”隐藏实现细节

class-continuation分类
该分类与普通的分类不同,他必须定义在其所持续的那个类的实现文件中。其重要之处在于,这是唯一能声明实例变量的分类。与其他分类不同,该分类没有名字,举例说明:

@interface ECOPerson ()@end

这样你就可以在其中定义你的私有方法和私有变量了,这样有什么好处呢?公共接口里本来就能定义实例变量。不过,把它们定义在“class-continuation分类”或“实现块”中可以将其隐藏起来,只供本类使用。

使用该类,我们可以将在public中定义的只读属性的对象更改为可读写属性,这样做既可以让外界无法修改对象,又能在其内部按照需要管理其数据。这样,封装在类中的数据就由实例本身来控制,而外部代码则无法修改其值。

要点:

  • 通过class-continuation分类向类中新增实例变量。
  • 如果某属性在主接口中声明为“只读”,而类的内部又要用设置方法修改此属性,那么就在“class-continuation分类”中将其扩展为“可读写”。
  • 把私有方法的原型声明在“class-continuation分类”里面。
  • 若想使类所遵循的协议不为人所知,则可于“class-continuation分类”中声明。

http://www.ppmy.cn/embedded/167755.html

相关文章

深度学习笔记——循环神经网络RNN

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍面试过程中可能遇到的循环神经网络RNN知识点。 热门专栏 机器学习 机器学习笔记合集 深度学习 深度学习笔记合集 文章目录 热门专栏机器学习深度学…

基于SpringBoot的校园消费点评管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

SQLite数据库从0到1

SQLite SQLite基础知识 SQLite数据库功能特性&#xff1a;ACID事务&#xff1b;支持数据库大小至2TB&#xff1b;足够小&#xff0c;大致13万行C代码4MB左右&#xff1b;存储在单一磁盘文件中的完整数据库。独立&#xff0c;无额外依赖。源码完全开源。支持多种编程语言&#…

嵌入式八股文(五)硬件电路篇

一、名词概念 1. 整流和逆变 &#xff08;1&#xff09;整流&#xff1a;整流是将交流电&#xff08;AC&#xff09;转变为直流电&#xff08;DC&#xff09;。常见的整流电路包括单向整流&#xff08;二极管&#xff09;、桥式整流等。 半波整流&#xff1a;只使用交流电的正…

HIVE表操作

Hive有四种表&#xff1a;内部表&#xff0c;外部表&#xff0c;分区表&#xff0c;分桶表。分别对应不同的需求。又可将他们分为两组内部表和外部表、分区表和分桶表&#xff0c;其中分区表在企业中用的最多&#xff0c;可以说百分之八九十的表都是分区表。 创建表 方式1&…

大模型在癫痫预测及临床方案制定中的应用研究报告

目录 一、引言 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究方法与创新点 二、大模型技术概述 2.1 大模型的基本原理 2.2 常见大模型在医疗领域的应用 2.3 大模型用于癫痫预测的优势 三、大模型在癫痫术前预测中的应用 3.1 致痫灶定位预测 3.1.1 基于影像数据的…

网红框架SpringBoot2.x之框架简介及环境搭建

SpringBoot基于Spring框架进行“变态级“封装和扩展&#xff0c;由于上手简单、配置简单、集成简单&#xff0c;使得SpringBoot一跃成为近几年Java开发界的网红&#xff0c;加之众多的开源同僚的鼎力支持&#xff0c;为SpringBoot框架构建起了强大的开发生态圈。SpringBoot 1.x…

GPU和FPGA的区别

GPU&#xff08;Graphics Processing Unit&#xff0c;图形处理器&#xff09;和 FPGA&#xff08;Field-Programmable Gate Array&#xff0c;现场可编程门阵列&#xff09;不是同一种硬件。 我的理解是&#xff0c;虽然都可以用于并行计算&#xff0c;但是GPU是纯计算的硬件…