【极客班】objective-C编程基础(下)

字符串处理

NSString特性

NSString是一个Unicode编码、16位字符的字符序列;NSString被定义为类,具有引用语意。

NSString的初始化方法如下:

字面量初始化:

初始化器:

工厂方法:

NSMutableString与NSString的区别:

NSMutableString为NSString的子类。

(1)NSString具有可变性,而NSString具有恒定性:

NSString是一个不可变的字符串对象。这不是表示这个对象声明的变量的值不可变,而是表示它初始化以后,你不能改变该变量所分配的内存中的值,但你可以重新分配该变量所处的内存空间。而NSMutableString是可变的,意味着你可以追加它的内存空间,或者修改它所分配的内存空间中的值。

(2)NSString具有共享机制,而NSMutableString不具有:

NSString:

【极客班】objective-C编程基础(下)_第1张图片

NSMutableString:

【极客班】objective-C编程基础(下)_第2张图片
NSString与NSMutableString基本操作命令:

NSString:

【极客班】objective-C编程基础(下)_第3张图片

NSMutableString:

【极客班】objective-C编程基础(下)_第4张图片

集合类型

Foundation framework中用于收集cocoa对象(NSObject对象)的三种集合分别是:NSArray 用于对象有序集合(数组)、NSSet 用于对象无序集合(集合)、NSDictionary用于键值映射(字典);对应的三种可变集合类(这三种可变集合类是对应上面三种集合类的子类):NSMutableArray、NSMutableSet、NSMutableDictionary。

NSArray

NSArray初始化:

【极客班】objective-C编程基础(下)_第5张图片

注意:工厂方法和初始化器这两种方法,后面都要有个nil结尾。

NSArray的元素必须是对象:

(1)字符串对象:

(2)如为基本数值类型,须用NSNumber封装为对象类型后,才能放入数组中:

(3)如为C语言结构类型,须用NSValue封装为对象类型后,才能放入数组:

NSArray具有常量性:

【极客班】objective-C编程基础(下)_第6张图片

NSArray常用操作:

数组遍历:

最快:Fast Enumeration,直接访问内存,优化索引检查,快5-10倍

较慢:NSEnumerator遍历:索引检查+动态消息调用

【极客班】objective-C编程基础(下)_第7张图片

最慢:For循环访问:索引检查+动态消息调用

数组查找:

indexOfObject查找是否存在“值相等”的对象:

indexOfObjectIdenticalTo查找是否存在“指针相等”:

数组排序:

NSSet:

NSSet是一个无序的集合,其存储对象不能重复。

NSSet初始化:

【极客班】objective-C编程基础(下)_第8张图片

工厂方法初始化后面要接一个nil;

NSSet是常量集合,而NSMutableSet是可变集合。

NSSet的长度和元素都不能更改,但指针指向的对象内部可以更改。

NSSet支持Fast Enumeration和NSEnumerator遍历,前者较快,且推荐使用前者。

NSDictionary:

NSDictionary是一个存储key-value的无序集合,key唯一,value可重复。

NSDictionary初始化:

【极客班】objective-C编程基础(下)_第9张图片

工厂方法初始化后面要接一个nil;

NSDictionary是常量集合,而NSMutableDictionary是可变集合。

NSDictionary的长度和元素都不能更改,但指针指向的对象内部可以更改。

NSDictionary支持Fast Enumeration和NSEnumerator遍历,前者较快,且推荐使用前者。

自动引用计数ARC

自动引用计数(Automatic Reference Counting)是Objective-C默认的内存管理机制,其针对堆上的对象,由编译器自动生成操作技术的指令(retain和release),来管理对象的创建与释放。

受ARC管理的对象:OC对象指针、Block指针、使用_attribute_((NSObject))定义的typedef;

不受ARC管理:值类型(简单值类型,C语言struct)、使用其他方式分配的堆对象、非内存资源。

引用计数管理:

新创建(使用alloc、new、copy)一个引用类型对象,引用计数为1

对象引用计数增1——retain操作:将对象赋值给其他变量或常量、将对象引用赋值给其他属性或实例变量、将对象传递给函数参数,或者返回值、将对象加入集合中。

对象引用计数减1——release操作:将局部变量或全局变量赋值为nil或其他值、将属性赋值为nil或其他值、实例属性所在的对象被释放、参数或局部变量离开函数、将对象从集合中删除。


【极客班】objective-C编程基础(下)_第10张图片

如上图所示,当指针指向该对象时,引用计数加一;减少指针时引用计数减一。

协议

类型的合同约定,只描述外部接口,不提供具体实现。

协议可以包含的成员:属性、实例方法、类方法,但是不包含实例变量成员。

定义一个Drawable类如下:

【极客班】objective-C编程基础(下)_第11张图片

一个BLNPiont类遵守协议就必须要实现协议约定的所有@require成员(默认为require),其中属性最好是在.h文件里:

【极客班】objective-C编程基础(下)_第12张图片

.m文件如下:

【极客班】objective-C编程基础(下)_第13张图片

协议继承:

一个协议继承一个或多个协议:

【极客班】objective-C编程基础(下)_第14张图片

实现子协议的类型,也必须实现父协议中约定的成员:

【极客班】objective-C编程基础(下)_第15张图片

协议组合:

可以使用protocol来组合多个协议:

实现组合协议的类型,必须实现组合协议中的每一个协议:

【极客班】objective-C编程基础(下)_第16张图片

类别与扩展

类别

类别支持在没有源代码的情况下,基于特定的场合,为一个类增加功能。

命名一般为类名+扩展方法,如:NSString+Drawing.h/.m

可以添加类方法、实力方法和重写基类方法:

【极客班】objective-C编程基础(下)_第17张图片

但是不能添加属性、实例变量以及已存在的同名方法;不过可以通过添加set和get方法来实现和添加属性一样的方法:

【极客班】objective-C编程基础(下)_第18张图片


扩展Extension

扩展支持在编译时、有类的源代码的前提下,向类添加功能。

接口定义在.m文件中@implementation前声明,实现代码仍然在@implementation内实现:

【极客班】objective-C编程基础(下)_第19张图片

扩展添加成员包括:属性、实例成员、类方法、实例方法、修改属性的读写方法;但扩展实现的成员只能在.m实现文件内部访问,在类外不可以直接访问。

你可能感兴趣的:(【极客班】objective-C编程基础(下))