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成结构体app

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)atom

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]];

相关文章
相关标签/搜索