美文网首页iOS学习笔记
【极客班】objective-C编程基础(下)

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

作者: xiongsirui | 来源:发表于2016-03-13 03:49 被阅读54次

    字符串处理

    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实现文件内部访问,在类外不可以直接访问。

    相关文章

      网友评论

        本文标题:【极客班】objective-C编程基础(下)

        本文链接:https://www.haomeiwen.com/subject/njizkttx.html