一、 OC中的对象类型
OC中对于数据的处理都是采用将简单的数据类型封装成对象这种方式,这和C语言就有很大的不同。
1.1 字符串类
在C语言中,我们知道没有真正的字符串类型,一般是用数组去保存字符串。但是在OC中,NSString这个类,用于对字符串进行处理。
三种初始化方式:
1. 字面量初始化:
NSString *str=@"hello world";
2. 初始化器方法:
NSString *str1=[[NSString alloc]initWithString:str];
NSString *str2=[[NSString alloc]initWithFormat:@"你好"];
3.工厂方法:
NSString *str3=[NSString stringWithFormat:@"大家好"];
不难发现NSString中存储的是指针,其指向堆上的值。其实NSString已经将字符封装成了对象了。str不仅能调用堆上的值,还能调用NSString类中的实例方法。
*在OC中NSString还有“共享机制”这种特殊的存储规则,其目的是减少内存的使用。其会将值想等的内存共享给不同的对象。这样做会引发几条现象:
(1):有效减少内存的占用;
(2):NSString中保存的值不会改变。
也就是说,当使用工厂方法给 str赋新值的时候,相当于重写赋予一个对象,而不是改变str指向的值。
如果要频繁改变字符串的值。可以使用NSMutableSring。其是NSString的子类。取消了共享机制,并且增加了许多的类方法与实例方法方便开发者对值进行操作。
NSMutableString有一个特点需要注意,NSMutableString是动态的字符串,其内存大小在初始化后,如果在使用中存储的字符串超出了预定的内存大小。NSMutableString将自动重写分配一次内存大小,其大小为原内存的两倍。重点是这种操作给予计算机的负担特别大。会影响程序的效率。
1.2 集合类
OC中有三种集合类。
NSArray类,是有序的数组。
NSSet类,是无序的集合类,并且不能存储相同的集合元素。其规则和数学中的集合极为相似。
NSDictionary是键值对的存储方式。
三种类均有对应的Mutable子类。
NSMutableArray超过预设的存储大小,程序的效率会更低。这是因为在超过预定长度时,编译器会作三件事:(1) 分配新的堆内存,2倍于原内存。
(2) 将原来堆内存上的元素拷贝到新内存
(3) 释放原来堆内存
三种类都只能存储对象。如果要将简单的数据类型存储在集合中,必须封装成类。
基本类型用NSNumber封装。结构类型用NSValue封装。
注意:三种集合类虽然具有长量性(长度和元素指针都不能更改)但是指针指向的对象内部可以更改。
三种集合类的初始化方式和一些常用的类方法与实例方法就不在详述。应该自己下阅读官方文档,和进行必要的练习。
内存模型为:保存一个存储在栈上的地址。这个地址指向堆上保存的所有对象的值地址。堆上的对象地址就是数组保存的值。
for in 是最快的内存遍历方法!
二、ARC机制
是OC中的内存管理机制,其作用相当于Java中的垃圾回收机制,但是和Java最大的不同是其是短时回收机制,这就决定了OC跟适合运用于应用软件的开发,而Java更适合做服务器的开发。
ARC全称为:Automatic Reference Counting(自动引用计数),ARC的出现将程序猿从繁复的内存管理中解放出来。现在OC默认开启ARC。
ARC管理三种对象:1.OC对象指针。2.Block指针。3.使用_attribute_((NSObject))定义的typedef
ARC不管理以下三种类型:1.值类型(简单值类型,C语言struct)2.使用其它方式分配的堆对象(如使用malloc分配)3.非内存资源
OC中当ARC管理的对象引用计数为零的时候将自动被释放,新建一个引用类型对象(alloc,new,copy),引用计数将变为1,而以下四种操作将增加引用计数:
(1) 将对象引用赋值给其它变量或常量。(2) 将对象已用赋值给其它属性或实例变量(3)将对象传递给函数参数,或者返回值 (4)将对象加入集合中
以下四种操作将减少引用计数:
(1)将局部变量或全局变量赋值为nil或其它值。(2) 将属性赋值为nil或其它值。 (3)实例属性所在的对象被释放。 (4)参数或局部变量离开函数 (5) 将对象从集合中删除
放于@AutoRelease Pool中的对象将会函数结束时自动释放,@AutoRelease Pool可以嵌套使用,目的是创建大量对象后,需要立即释放。
三、协议、类别与扩展
3.1协议
在Xcode中Command+N,选择Objective—C file,可以快速创建一个OC的协议。
协议有如下特点:1.协议能继承多个协议。2.协议只有.h文件,意味着,只能声明方法和定义属性。并不能实现它们。3.一个类能同时遵守过个协议。
协议中默认都是@require类型,其意味着这些属性和方法必须在遵守协议的类中实现。但是写在@optional下的属性或方法可以选择实现。
提示:可以用conformsToProtocol:检查对象是否实现了协议。
以下协议是OC中经常用到的官方协议,需要下来多学习与熟悉:
NSObject、NSCopying、NSMutableCopy、NSFastEnumeration、NSCoding。
3.2 类别与扩展
类别和扩展都是为原有存在的类添加新的方法。但是两者间有着较大的区别。
类别:能在不知道类的源文件的情况下为原有的类添加方法,可以类方法也可以是实例方法,但是不能添加成员变量和属性。类别自身有独立的.h和.m文件。并且能被子类继承。命名规范为:类名+扩展名。类别有个功能是为特别大型的类进行分割实现。
扩展:必须知道类的源文件。其没有独立的.h和.m文件。其接口和实现均写在被扩展类的.m文件着,这意味着扩展中定义的实例变量和方法都是私有的。外部不能调用。只能在类内中调用。