Objective-C学习笔记

一.Foundation框架简介

所谓的框架式由许多类/方法/函数/文档按照一定的逻辑组织起来的集合,以便使研发程序变得更容易,
Mac下大约有90多个框架,而为所有的程序开发奠定基础的框架称为Foundation框架,他允许使用一些
基本对象,包括:数字/字符串/集合/日期/内存/文件/存储/几何;ApplicationKit框架用来开发交互式
图形应用程序;通常所有的两个术语:
1.Cocoa:Foundation/CoreData/ApplicationKit
2.CocoaTouch:Foundation/CoreData/UIKit

二.数字/字符串/集合

1.数字对象:NSNumber,他可以把基本数据类型打包成对象,进而可以向他们发送消息,对于每种基本数据
类型,类方法都能为它创建一个NSNumber对象,并设置为指定的值,这些方法以numberWithXXX开头,紧接数据
的类型;此外,可以使用实例方法将以前创建的NSNumber对象设置为指定的值,这些都是以initWithXXX开头的;
相应获取基本数据的接口为XXXValue;并提供isEqualToNumber和compare方法来进行数字对象的比较。

2.字符对象:NSString/NSMutableString,以@开头的unichar字符组成的字符串;NSLog格式字符%@不仅可以显示
NSString对象,而且还可以显示其他对象;事实上,通过覆盖继承的description方法,还可使用这些格式字符显示
你自己的类对象,如果不覆盖,NSLog仅仅显示类名和该对象在内存中的地址;注意NSRange不是一个对象,而是一个
结构,可以通过NSMakeRange方法生成;NSString是不能改变的,如果要改变可以使用他的子类NSMutableString,称
为可变字符,综上所述,该类有、以下几个类型的API:创建及初始化/判断和比较/大小写转换/截取/转换类型/对文
件的处理/可变字符/其他。

3.数组对象:NSArray/NSMutableArray,就像存在可变字符串和不可变字符串,同样也存在可变数组和不可变数组;
有以下几个类型的API:创建及初始化/数组元素的操作/可变数组;需要注意的的是基本类型必须转成NSNumber,结构体
必须转成NSValue,才能进行操作,并且如果使用复杂的运算法则操纵大型数字数组,采用C语言提供的低级数组构造执行
这种任务可能更加有效。self.name=theName等价于[self setName:theName],他会使用setter方法为实例变量赋值;与此
不同的是,name=theName的写法绕过了setter方法,直接为实例变量赋了参数的值;故推荐采用前者来增加一层抽象性。
在使用比较的过程中,会使用NSComparisonResult类型的值,他提供以下几种选择: NSOrderedAscending/NSOrderedSame/
NSOrderedDescending。
注意:对于CGPoint/CGSize/CGRect/NSRange这种常用的结果用,需要借组NSValue的valueWithXXX方法来wrapping成对象,
并利用XXXValue来unwrapping成结构体

4.字典对象:NSDictionary/NSMutableDictionary,存在可变字典和不可变字典,他们都是所谓的由键-对象对组成的数据集合,
词典中的键必须是单值得,通常他们是字符串,但也可以是其他对象类型。有以下几个类型的API:创建及初始化/访问键值/
文件处理/可变字典/其他。

5.集合对象:NSSet/NSMutableSet/NSIndexSet/NSCountedSet,他是一组单值对象集合,可以使可变的,也可以使不变的,有以下
几个类型的API:创建及初始化/访问元素/判断比较/可变集合。比较特别的是NSIndexSet,他用于存储有序的索引到某种数据结构,
比如数组的indexesOfObjectsPassingTest方法,会接受一个传递数组元素/索引号/BOOL变量指针的区块,返回NSIndexSet代表包含
数组中满足条件的所有元素的索引。他有以下几个对象实例方法:containIndex/firstIndex/lastIndex/indexLessThanIndex/
indexesPassingTest。

三.文件管理

利用NSFileManager和NSFileHandle提供以下几种API:文件与目录的操作/获取文件盒目录信息/判断文件/文件读取/目录工具函数:

1.NSFileHandle:可以打开文件并对文件执行多次读/写操作
2.NSURL:利用其类方法URLWithString生成后,允许在应用中使用URL方法,此后就可以用URL的内容了,
包括stringWithContentsOfURL/dictionaryWithContentsOfURL/arrayWithContentsOfURL/dataWithContentsOfURL
3.NSBundle:允许在应用中使用包的方法
/代表根目录;~代表用户主目录;.代表当前目录;..代表父目录;在使用文件时,需要频繁地将
4.NSData/NSMutableData:允许用来设置缓冲区,将文件的内容读入缓冲区,或将缓冲区的内容写到文件中
5.NSDirectoryEnumerator:可以采用他来遍历Directory,例如
BOOL flag;
NSFileManager* fm = [NSFileManager defaultManager];
NSString* path = [fm currentDirectoryPath];
NSDirectoryEnumerator* dirEnum = [fm enumeratorAtPath:path];
while((path=[dirEnum nextObject]) != nil)
{
[fm fileExistsAtPath:path isDirectory:&flag];
if(flag == YES)
[dirEnum skipDescenedents];
}
6.使用NSPathUtilities.h的辅助函数来操作文件系统
7.常用的目录
1).Documents(NSDocumentDirectory):写入应用相关数据文件的目录,iTunes会看到,还可以备份到云端
2).Libray/Caches(NSCachesDirectory):写入应用支持文件的目录,iTunes不会看到,也不会备份到云端
3).tmp(NSTemporaryDirector):存放临时文件,程序终止的时候要移除他
4).Library/Preferences:程序的偏好设置文件,使用NSUserDefaults来创建/读取/修改
8.NSProcessInfo:允许你设置或检索正在运行的应用程序的各种类型的信息
注:FileHandle类并没有提供创建文件的功能,必须使用FileManager方法来创建文件,因此他相关的Writing/
Reading/Updating的API都假定文件已经存在,否则返回nil
9.NSBundle:当创建一个应用时,系统存储了应用相关的所有数据,并将这些内容放入一个称为application
bundle中,这个类就为了访问这些资源而生,他提供以下几个方法:
1).mainBundle:应用包所在目录
2).pathForResource:ofType:列出该目录指定的文件并返回文件的路径,随后可以用stringWithContentsOfFile
来将文件读取到程序中
3).pathsForResourcesOfType:inDirectory:列初指定目录下相应后缀名的文件列表

四.内存管理

提供给Objective-C程序的基本内存管理模型有以下三种:
1.自动垃圾收集:当内存到低位时,开始清理,是一个计算密集的过程,仅仅Mac支持
2.手工引用计数和自动释放池:前者利用retain/release计数机制,后者利用NSAutoreleasePool/drain机制,
在该环境下,可以为属性添加atomic/nonatomic,assign/retain/copy特性;对使用了retain/copy/mutableCopy/
alloc/new方法的任何对象,以及具有retain/copy特性的属性进行释放,需要覆盖dealloc方法,使得在对象被释放
的时候能释放这些实例变量
3.自动引用计数(ARC):内部维护引用计数,系统会检测何时需要保持对象和释放对象,编译器会管理好对象的内存,
通过生成正确的代码区自动释放或保持返回的对象

1)强变量:
当给变量赋值的时候,新的retain,旧的release,然后把新的assign给旧的,如果使用ARC,需要使用__strong关键字,
或者为属性添加strong特性,默认是unsafe_unretained(assign)

2)弱变量:
当两个对象都持有彼此的强引用时,将会产生循环保持(retain cycle),解决这个问题可以弱引用,需要使用__weak
关键字,或者为属性添加weak特性,需要注意的是,iOS4和Mac10.6中不支持弱变量

3)@autoreleasepool块
在main中,有一个大块,会在应用程序结束的时候进行清理,如果在局部创建,可以再内部进行块的嵌套

五.复制对象:

通过实现一个符号<NSCopying>协议的方法来制作副本,如果类必须区分要产生对象的是可变副本还是不可变副本,
还需要根据<NSMutableCopying>协议实现一个方法,即copy和mutableCopy方法;如果是自己编写的类,可以要支持
copy方法就需要实现<NSCopying>协议,进而实现copyWithZone方法,在该方法中,参数zone的类型为NSZone,他与不
同的存储区有关,你可以在程序中分配并使用这些存储区。只有在编写要分配大量内存的应用程序并且想要通过将空间
分配分组到这些存储区来优化内存分配时,才想要处理这些zone参数,可以使用传递给allocWithZone的内存分配方法,
在指定的存储区中分配内存;如果结合属性一起使用,想要添加copy的特征。

六.归档:

1.使用XML属性列表进行归档
可以使用XML属性列表(plists)存储诸如默认参数选择、应用程序设和配置信息这样的数据;特别的是如果对象是
NSString、NSDictionary、NSArray、NSData或NSNumber,就可以使用对象方法writeToFile:atomically将数据写到
文件中;打开的时候就可以利用类方法XXXWithContentsOfFile将文件传入以相应的内容来创建对象;需要注意的是
如果想在程序中使用属性列表,可以查看NSPropertyListSerialization类。

2.使用NSKeyedArchiver归档
使用它可以写入除字符串、数组和字典外的其他类型,他提供了一个类方法archiveRootObject:toFile来序列化;
反之,利用类方法unarchiveObjectWithFile来反序列化;此时,如果操作一个非自带的对象,就会报错,除非你
按照<NSCoding>协议,来实现encodeWithCoder和initWithCoder;需要注意的是对象调用encodeObject:forKey和
decodeObjectforKey来完成(如果是非内置对象就会调用到encodeWithCoder/initWithCoder),基本数据类型调用
encodeXXX:forKey和decodeXXXforKey。

3.使用NSData归档
首先创建NSMutableData对象,并在创建NSKeyedArchiver对象之后,以data对象为参数调用initForWritingWithMutableData,
获得archiver,此时,就可以向存储在archiver中的对象发送编码信息,实际上,所有的编码信息在收到finishEncoding消息
之前都被归档在指定的数据空间内,最后再调用NSData的方法writeToFile:atomically将数据写入文件。

4.使用归档程序复制对象
dataArray2 = [NSKeyedUnarchiver unarchiveObjectWithData:
[NSKeyedArchiver archiverdDataWithRootObject : dataArray]];

 

posted @ 2014-04-06 16:58  腐烂的翅膀  阅读(401)  评论(0编辑  收藏  举报