字符串处理
NSString特性
NSString是一个Unicode编码、16位字符的字符序列;NSString被定义为类,具有引用语意。
NSString的初始化方法如下:
字面量初始化:
初始化器:
工厂方法:
NSMutableString与NSString的区别:
NSMutableString为NSString的子类。
(1)NSString具有可变性,而NSString具有恒定性:
NSString是一个不可变的字符串对象。这不是表示这个对象声明的变量的值不可变,而是表示它初始化以后,你不能改变该变量所分配的内存中的值,但你可以重新分配该变量所处的内存空间。而NSMutableString是可变的,意味着你可以追加它的内存空间,或者修改它所分配的内存空间中的值。
(2)NSString具有共享机制,而NSMutableString不具有:
NSString:
NSMutableString:
NSString与NSMutableString基本操作命令:
NSString:
NSMutableString:
集合类型
Foundation framework中用于收集cocoa对象(NSObject对象)的三种集合分别是:NSArray 用于对象有序集合(数组)、NSSet 用于对象无序集合(集合)、NSDictionary用于键值映射(字典);对应的三种可变集合类(这三种可变集合类是对应上面三种集合类的子类):NSMutableArray、NSMutableSet、NSMutableDictionary。
NSArray
NSArray初始化:
注意:工厂方法和初始化器这两种方法,后面都要有个nil结尾。
NSArray的元素必须是对象:
(1)字符串对象:
(2)如为基本数值类型,须用NSNumber封装为对象类型后,才能放入数组中:
(3)如为C语言结构类型,须用NSValue封装为对象类型后,才能放入数组:
NSArray具有常量性:
NSArray常用操作:
数组遍历:
最快:Fast Enumeration,直接访问内存,优化索引检查,快5-10倍
较慢:NSEnumerator遍历:索引检查+动态消息调用
最慢:For循环访问:索引检查+动态消息调用
数组查找:
indexOfObject查找是否存在“值相等”的对象:
indexOfObjectIdenticalTo查找是否存在“指针相等”:
数组排序:
NSSet:
NSSet是一个无序的集合,其存储对象不能重复。
NSSet初始化:
工厂方法初始化后面要接一个nil;
NSSet是常量集合,而NSMutableSet是可变集合。
NSSet的长度和元素都不能更改,但指针指向的对象内部可以更改。
NSSet支持Fast Enumeration和NSEnumerator遍历,前者较快,且推荐使用前者。
NSDictionary:
NSDictionary是一个存储key-value的无序集合,key唯一,value可重复。
NSDictionary初始化:
工厂方法初始化后面要接一个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或其他值、实例属性所在的对象被释放、参数或局部变量离开函数、将对象从集合中删除。
如上图所示,当指针指向该对象时,引用计数加一;减少指针时引用计数减一。
协议
类型的合同约定,只描述外部接口,不提供具体实现。
协议可以包含的成员:属性、实例方法、类方法,但是不包含实例变量成员。
定义一个Drawable类如下:
一个BLNPiont类遵守协议就必须要实现协议约定的所有@require成员(默认为require),其中属性最好是在.h文件里:
.m文件如下:
协议继承:
一个协议继承一个或多个协议:
实现子协议的类型,也必须实现父协议中约定的成员:
协议组合:
可以使用protocol<A,B,...>来组合多个协议:
实现组合协议的类型,必须实现组合协议中的每一个协议:
类别与扩展
类别
类别支持在没有源代码的情况下,基于特定的场合,为一个类增加功能。
命名一般为类名+扩展方法,如:NSString+Drawing.h/.m
可以添加类方法、实力方法和重写基类方法:
但是不能添加属性、实例变量以及已存在的同名方法;不过可以通过添加set和get方法来实现和添加属性一样的方法:
扩展Extension
扩展支持在编译时、有类的源代码的前提下,向类添加功能。
接口定义在.m文件中@implementation前声明,实现代码仍然在@implementation内实现:
扩展添加成员包括:属性、实例成员、类方法、实例方法、修改属性的读写方法;但扩展实现的成员只能在.m实现文件内部访问,在类外不可以直接访问。
网友评论