使用NSData与NSMutableData
类方法创建对象以data开头,实例方法以init开头:
- data 创建一个不包含任何数据的空的NSData对象
- dataWithBytes:length:、initWithBytes:length: 复制C数组所包含的数据来初始化NSData数据
- dataWithBytesNoCopy:length:、initWithBytesNoCopy:length: 直接利用C数组所包含的数据来初始化NSData对象,当该对象被执行malloc销毁自己时,程序会自动释放C数组
- dataWithBytesNoCopy:length:freeWhenDone:、initWithBytesNoCopy:length:freeWhenDone: 直接利用C数组来初始化NSData对象,只有当最后一个参数为YES时,销毁对象时才会自动释放C数组
- dataWithContentsOfFile:、initWithContentsOfFile: 直接读取文件内容,病利用文件内容来初始化NSData
- dataWithContentsOfURL:、initWithContentsOfURL: 直接读取URL关联的内容,并用之出书画NSData
- dataWithData:、initWithData: 用另一个NSData所包含的数据来初始化NSData
NSData的方法:
- bytes 返回包含的数据
- getBytes:length: 获取指定范围内的数据
- subdataWithRange: 获取指定范围数据组成的NSData对象
- writeToFile:atomically: 将NSData写入文件
- writeToURL:atomically: 将NSData写入URL指定的资源
使用NSFileManager管理文件和目录
相对路径:不以 / 开头的路径
绝对路径:以 / 开头的路径
特殊路径:
- ~ 代表当前用户的Home目录 ~lyz与/Users/lyz 是等价的
- . 代表当前目录
- .. 代表当前目录的上一级目录
创建NSFileManager对象:
NSFileManager* fm = [NSFileManager defaultManager];
访问文件的属性和内容:
- fileExistsAtPath: 判断指定文件名对应的文件是否存在
- fileExistsAtPath:isDirctory: 判断该指定文件名对应的文件或者目录是否存在,该方法的后一个参数可用于返回该文件是否为目录
- isReadableFileAtPath: 判断指定目录下得文件是否可读
- isWritableFileAtPath: 判断指定目录下得文件是否可写
- isExecutableFileAtPath: 判断指定目录下得文件是否可执行
- isDeletableFileAtPath: 判断指定目录下得文件是否可删除
- componentsToDisplayForPath: 获取指定文件名对应文件的各个路径组件
- displayNameAtPath: 获取指定文件名对应文件的简单文件名
- attributesOfItemAtPath:error:获取指定文件名对应文件的属性
- attributesOfFileSystemForPath:error: 获取指定文件名对应的文件所在文件系统的属性
- setAttributes:ofItemAtPath:error: 设置指定文件名对应文件的属性
- contentsAtPath: 获取指定文件名对应文件的内容
- contentsEqualAtPath:andPath:判断两个文件名指定的文件内容是否相同
创建、删除、移动、复制:
- createDirectoryAtURL:withIntermediateDirectories:attributes:error: 依据指定的URL创建目录
- createDirectoryAtPath:withIntermediateDirectoris:attributes:error: 依据指定的路径创建目录
- createFileAtPath:contents:attributes: 依据指定的文件路径、内容创建文件
- removeItemAtURL:error: 删除指定URL对应的文件
- removeItemAtPath:error: 删除指定路径对应的文件
- copyItemAtURL:toURL:error: 依据指定的URL复制文件或者目录
- copyItemAtPath:toPath:error: 依据指定的路径复制文件或者目录
- moveItemAtURL:toURL:error: 依据指定URL移动文件或者目录
- moveItemAtPath:toPath:error: 依据指定路径移动文件或者目录
查看目录包含的内容:
- contentsOfDirectoryAtPath:error: 获取指定目录下所有文件和子目录,不会对子目录进行递归枚举
- enumeratorAtPath: 获取指定目录下所有文件和子目录对应的枚举器(NSDirectoryEnumerator),默认会递归枚举子目录中所有内容,当然可调用NSDirectoryEnumerator的skipDescendants方法来组织递归枚举子目录
- subpathsOfDirectoryAtPath:error: 递归获取指定路径包含的所有目录和子目录
- subpathsAtPath: 与前一个方法类似
使用NSPathUtilities.h管理路径
NSPathUtilities.h对NSString类进行了扩展,从而新增了一些专门用于操作路径的方法:
- +pathWithComponents:opponents: 依据components中的元素构造有效的路径
- -(NSArray*)pathComponents: 分拆路径,返回该路径各部分所组成的数组
- -(BOOL)isAbsolutePath: 返回该路径是否为绝对路径
- -(NSString*)lastPathComponent: 提取路径最后一个组成部分
- -(NSString*)pathExtension: 从路径的最后组成部分提取扩展名
- -(NSString*)sringByAbbreviatingWithTildeInPath: 将路径中当前用户的home路径替换为 ~user
- -(NSString*)stringByAppendingPathComponent:path: 将path添加到现有路径的结尾处
- -(NSString*)stringByAppendingPathExtension:ext: 将ext添加到现有路径的结尾处
- -(NSString*)stringByDeletingLastPathComponent: 删除路径最后一个组成部分
- -(NSString*)stringByDeletingPathExtension: 删除路径最后组成部分的扩展名
- -(NSString*)stringByExpandingTildeInPath: 将路径中的带字符(~或~user)解析成当前用户的home目录或指定用户的home目录
- -(NSString*)stringByResolvingSymlinksInPath: 解析路径中的符号链接,返回解析后的路径
- -(NSString*)stringByStandardizingPath: 解析路径中的 ~ . ..和符号链接,返回解析后生成的标准路径
还包含如下常用函数来获取系统的相关属性:
- NSUserName() 返回当前用户名
- NSFullUserName() 返回当前用户的完整用户名
- NSHomeDirectory() 返回当前用户的home目录
- NSHomeFirectoryForUser(user) 返回指定用户的home目录
- NSTemporaryDirectory() 返回系统临时目录
使用ProcessInfo获取进程信息
创建NSProcessInfo对象:
NSprocessInfo proInfo = [NSProcessInfo processInfo];
对应的方法:
- arguments 返回运行该进程所传入参数组成的NSArray对象
- environment 返回系统内所有环境变量名和值所组成的NSDictionary对象
- processIdentifier 返回该进程的标识符
- globallyUniqueString 返回一个全局、位移的字符串
- processName 返回进程名
- setProcessName: 设置进程名
- hostName 返回进程所在系统的主机名
- operatingSystem 返回进程所在系统的操作系统
- operatingSystemName 返回进程所在系统的操作系统名
- operatingSystemVersionString 返回进程所在系统的操作系统版本号
- physicalMemory 返回系统的物理内存
- processCount 返回系统中处理器的数量
- activeProcessorCount 返回系统中激活状态的处理器数量
- systemUptime 返回系统已运行的时间
使用NSFileHandle处理文件IO
创建NSFIleHandle对象:
NSFIleHandle* fh = [NSFileHandle fileHandleForReadingAtPath:@”test.txt”];
// PS:NSFileHandle没有提供创建文件的功能,弱项创建文件需要使用FIleManager来创建对象。
常用方法:
- +fileHandleForReadingAtPath: 依据指定路径打开一个准备读取内容的文件,并返回该文件对应的NSFileHandle
- +fileHandleForReadingFroURL:error: 依据指定URL打开一份准备读取内容的文件,并返回文件对应NSFileHandle
- +fileHandleForWritingAtPath: 依据指定路径打开一个准备写入内容的文件,并返回该文件对应的NSFileHandle
- +fileHandleForWritingToURL:error: 依据指定路径打开一个先准备写入内容的文件,并返回该文件对应NSFIleHandle
- +fileHandleForUpdatingAtPath: 依据指定路径打开一个可读可写的文件,并返回该文件对应的NSFileHandle
- +fileHandleForUpdatingURL:error: 依据指定URL打开一个可读可写的文件,并返回该文件对应的NSFIleHandle
- +fileHandleWithStandardError: 打开标准错误输出设备对应的NSFIleHandle
- +fileHandleWithStandardInput: 打开标准输入设备对应的NSFileHandle
- +fileHandleWithStandardOutput: 打开标准输出设备对应的NSFileHandle
- +fileHandleWithNullDevice: 打开控设备对应的NSFileHandle
- -fileDescriptor: 获取对应的文件描述器
- -availableData: 返回该文件所有可用的数据
- -readDataToEndOfFile: 读取该文件中包含的所有数据
- -readDataOfLength”length: 读取该文件中length字节的数据
PS:该方法每次返回length字节的数据包装成的NSData对象,如果已经到了文件的结尾处,程序将会返回一个不包含任何数据的NSData对象,因此,城西可以通过该方法返回的NSData的length方法是否为0来判断是否已经读到了文件的结尾处。 - -writeData:data: 将制定数据data输入到该文件中
- -offsetInFile: 获取该NSFileHandle种文件指针的位置
PS:文件指针记录了当前读写文件的位置,也就是说,文件指针所在的位置也就是接下来NSFIleHandle将要读写文件的位置 - -seekToEndOfFile: 将该NSFIleHandle种文件指针移动到文件的结尾处
- -seekToFileOffset:offset: 将NSFileHandle中文件指针移动到指定位置
- -closeFile: 关闭底层文件
- -truncateFileAtOffset:offset: 将文件长度截断为offset字节,如offset参数小于文件本身大小,多余的备份被截断;如果该offset参数大于文件本身大小,文件末尾将会被填充空数据
使用NSURL读取网络资源
NSURL* url = [NSURL URLWithString:@"http://www.baidu.com/tieba.aspx"];
NSLog(@"scheme is %@, host is %@, port is %@, path is %@", [url shame], [url host], [url port], [url path]);
使用NSBundle处理项目相关资源
在应用中添加资源:
吧文件拖到Xcode左边的项目导航面板中,出现对话框中现则赋值资源文件到项目中即可。
常用方法:
- -URLForResouce:withExtension:subdirectory: 依据资源名、扩展名从指定子目录中获取该资源对应的URL
- -URLForResource:withExtension: 依据资源名、扩展名获取该资源对应的URL
- -pathForResource:ofType: yiju 依据资源名类型名获取该资源对应的路径
- -URLsForResourceWithExtension:subdirectory: 获取指定子目录下匹配特定扩展名的所有资源对应的URL组成的数组
- -pathForResource:ofType:inDirectory: 从指定子目录下依据资源名类型名获取该资源对应的路径
- -pathsFoeResourceOfType:inDirectory: 获取指定子目录下匹配特定类型名的所有资源对应的路径组成的数组
- -resourcePath: 直接依据完整的资源路径来获取对应的资源
//获取名为test.txt资源文件的路径
NSString* filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"txt"];
对象归档
使用NSKeyedArchiver和NSKeyedUnarchiver进行归档和恢复
NSDictionary dict = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:89], @"OC", [NSNumber numberWithInt:69], @"Ruby", nil];
//对dict进行归档
[NSKeyedArhciver archiveRootObject:dict toFile:@"myDict.archive"];
//从myDict.arhive中恢复对象
NSDictionary duct2 = [NSKeyedUnarchiver unarchiveObjectWithFile:@"myDict.archive"];
归档恢复自定义对象
支持归档恢复的自定义类需要实现NSCoding协议,并实现该协议中如下两个方法:
- initWithCoder: 该方法负责恢复对象
- encodeWithCoder: 该方法负责归档对象
数据类型(如整数或浮点型),可使用下表中方法进行归档或者恢复:
归档数据 | encodeBool:forKey: | encodeInt:forKey: | encodeInt32:forKey: | encodeInt64:forKey: |
恢复数据 | decodeBool:forKey: | decodeInt:forKey: | decodeInt32:forKey: | decodeInt64:forKey: |
归档数据 | encodeFloat:forKey: | encodeDouble:forKey: | ||
恢复数据 | decodeFloat:forKey: | decodeDouble:forKey: |
实现NSCoding中的方法如下:
- (void) encodeWithCoder: (NSCoder*) coder
{
//调用NSCoder的方法归档该对象的每个实例变量
[coder encodeObject:_color forKey:@"color"];
[coder encodeObject:_size fprKey:@"size"];
}
- (id) initWithCoder:(NSCoder*) coder
{
//使用NSCoder依次恢复实例变量
_color = [coder decodeObjectFoyKey:@"color"];
_size = [coder decodeObjectForKey:@"size"];
return self;
}
使用NSData完成自定义归档
借助NSMutableData来创建NSKeyedArchiver或NSKeyedUnarhiver对象来实现多个对象归档到单个文档或冲单个文档恢复多个对象
//创建NSMutableData对象用于保存归档数据
NSMutableData* data = [NSMutableData data];
//以NSMutableData对象作为参数,创建NSKeyedArchiver对象
NSKeyedArchiver* arch = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
//重复调用encodeObject:forKey:方法归档dict、set、apple对象
[arch encodeObject:dict forKey:@"myDict"];
[arch encodeObject:set forKey:@"mySet"];
[arch encodeObject:apple forKey:@"myApple"];
//归档结束
[arch finishEncoding];
//程序将NSData缓存区保存的数据写入文件
if([data writeToFile:@"myFile.archive" atomically:YES] == NO)
{
NSLog(@"Arhive Failed!");
}
//创建衣蛾NSData对象一个与读取文档中的数据
NSData* data2 = [NSData dataWithContentOfFIle:@"myFile.archive"];
//以NSData对象为参数创建NSKeyedUnarhciver对象
NSKeyedUnarchiver* unarch = [[NSKeredUnarchiver alloc] initForReadingWithData:data2];
//重复调用decodeObjectForKey: 方法来恢复对象
NSDictionary* dict2 = [unarch decodeObjectForKey:@"myDict"];
NSSet* set2 = [unarch decodeObjectForKey:@"mySet"];
NSApple* apple2 = [unarch decodeObjectForKey:@"myApple"];
//恢复结束
[unarch finishDecoding];
归档恢复可实现深复制
//归档,将鬼低昂对象的数据写入NSData中
NSData* data = [NSKeyedArchiver archivedDataWithRootObject:dict];
//从NSData中恢复对象,即可完成深复制
NSDictionary* dictCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];