OC进阶(五)
1.NSFileManager的使用
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //NSFileManager 用于判断 NSString *filePath = @"/Users/apple/Desktop/arr.plist"; NSString *filePath2 = @"/"; // 1) 判断文件是否存在 //创建文件管理对象 //调用defaultManager 创建一个文件管理的单例对象 //单例对象:在程序运行期间,只有一个对象存在 NSFileManager *fm = [NSFileManager defaultManager]; // YES 存在 NO 不存在 BOOL isYES = [fm fileExistsAtPath:filePath]; NSLog(@"-->%d",isYES); if(isYES){ BOOL isDir; // 2) 判断是否是一个目录 [fm fileExistsAtPath:filePath isDirectory:&isDir]; if (isDir) { NSLog(@"这是一个目录"); }else{ NSLog(@"这不是一个目录"); } } // 3) 判断文件是否可读 isYES = [fm isReadableFileAtPath:filePath]; // 4) 是否可写 isYES = [fm isWritableFileAtPath:filePath2]; // 5) 是否可删除 isYES = [fm isDeletableFileAtPath:filePath2]; NSLog(@"-->%d",isYES); } return 0; }
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //创建文件对象 NSFileManager *fm = [NSFileManager defaultManager]; NSString *filePath = @"/Users/apple/Desktop/arr.plist"; NSString *dirPath = @"/Users/apple/Desktop/a"; //1)如何获取文件的信息(属性) NSDictionary *dict = [fm attributesOfItemAtPath:filePath error:nil]; NSLog(@"%@",dict); NSLog(@"%@,%@",[dict objectForKey:@"NSFileOwnerAccountName"],dict[@"NSFileOwnerAccountName"]); //2)获取指定目录下文件及子目录 //使用递归的方式 获取当前目录及子目录下的所有的文件及文件夹 NSArray *subPaths = [fm subpathsAtPath:dirPath]; //subpathsOfDirectoryAtPath 不是使用递归的方式获取的 subPaths = [fm subpathsOfDirectoryAtPath:dirPath error:nil]; NSLog(@"subPaths = %@",subPaths); //3)获取指定目录下的文件及目录信息(不在获取后代路径) subPaths = [fm contentsOfDirectoryAtPath:dirPath error:nil]; NSLog(@"subPaths = %@",subPaths); } return 0; }
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //创建文件管理对象 NSFileManager *fm = [NSFileManager defaultManager]; //如何创建目录 (路径 :/Users/zhaoxiaohu/Desktop/aaa) NSString *createDirPath = @"/Users/apple/Desktop/aaa/ccc/bbb/love.txt"; // fm createDirectoryAtPath:@"路径" withIntermediateDirectories:YES/NO 创建路径的时候,YES自动创建路径中缺少的目录,NO的不会创建缺少的目录 attributes:属性的字典 error:错误对象 // BOOL isYES = [fm createDirectoryAtPath:createDirPath withIntermediateDirectories:YES attributes:nil error:nil]; // // if (isYES) { // NSLog(@"成功"); // } //如何创建文件 NSString *str = @"每当我错过一个女孩,我就向山上放一块砖,于是就有了长城"; //writeToFile // fm createFileAtPath:@"路径" contents: NSData类型的数据 attributes:文件的属性的字典 //创建NSData? 是一个处理二进制数据的类 //NSString -----> NSData NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; BOOL isYes; // // createFileAtPath 创建文件 // isYes = [fm createFileAtPath:createDirPath contents:data attributes:nil]; // NSLog(@"isYes = %d",isYes); //如何copy文件 // NSString *targetPath = @"/Users/apple/Desktop/aaa/ccc/love.txt"; // [fm copyItemAtPath:createDirPath toPath:targetPath error:nil]; NSString *targetPath = @"/Users/apple/Desktop/aaa/love.txt"; // //如何移动文件 // [fm moveItemAtPath:createDirPath toPath:targetPath error:nil]; //如何删除文件 [fm removeItemAtPath:targetPath error:nil]; } return 0; }
2.iOS的沙盒机制
/* 沙盒: 文件系统 每个应用程序都有自己的沙盒(iOS中每个应用程序,只能访问自己的沙盒) iOS8开始,开放了几个固定区域 沙盒包含: 应用程序包 Documents 持久化的数据 tmp 临时目录 Library cache 缓存 Preferences 配置信息\SQLite 沙盒路径获取的方法: 1)沙盒的路径 NSHomeDirectory() 2)Documents 路径 3)tmp 路径 4)Library 路径 */ #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //获取根目录 //Mac 用户的根目录 //iOS /Users/apple/Library/Developer/CoreSimulator/Devices/E74B0E6B-D94E-41E0-A4B1-72D9DB64808F/data/Containers/Data/Application/9E1FCB37-F3E2-4882-AA7C-5C07E031BB78 //1)沙盒根目录 NSString *sandBoxPath = NSHomeDirectory(); NSLog(@"sandBoxPath = %@",sandBoxPath); //2)Documents目录 //NSSearchPathForDirectoriesInDomains 返回绝对路径 // NSSearchPathForDirectoriesInDomains(要查找的目录, 是否是用户主目录, YES/NO 是否获取全路径) // NSDocumentDirectory 表示获取沙盒的Documents目录 ///Users/apple/Library/Developer/CoreSimulator/Devices/E74B0E6B-D94E-41E0-A4B1-72D9DB64808F/data/Containers/Data/Application/9E1FCB37-F3E2-4882-AA7C-5C07E031BB78/Documents NSArray *paths= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentPath = [paths lastObject]; NSLog(@"paths = %@",documentPath); } return 0; }
3.常见的结构体
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //CGPoint / NSPoint // NSPoint是CGPoint得一个别名 //用来 表示二维平面的一个 点 //包含两个成员 x(点的x方向) y(y方法) CGPoint c1; //c1是一个CGPoint结构体类型的变量 c1.x = 20; c1.y = 100; CGPoint c2 = {10,10}; CGPoint C3 = {.x = 10}; NSPoint np1; np1.x = 10; np1.y = 100; //OC中特有的赋值方式 CGPoint c4 = CGPointMake(10, 10); NSPoint np2 = NSMakePoint(5, 5); //CGSize和NSSize //用来表示平面的面积(大小) // width (宽) height(高) CGSize s1 ; s1.width = 200; s1.height = 100; //OC中特有的方式 CGSize s2 = CGSizeMake(100, 100); NSSize ns = NSMakeSize(10, 10); //CGRect 和 NSRect // 表示在平面上左上角是某个点的矩形区域 // origin 表示 矩形的左上角的点 // size 表示 矩形的大小 CGRect r1; //C语言赋值方式 r1.origin.x = 0; r1.origin.y = 0; r1.size.width = 200; r1.size.height = 80; CGRect r2 = {{0,1},{20,34}}; //OC特有的方式 // CGXXXX CGXXXXMake CGRect r3 = CGRectMake(10, 10, 100, 30); // NSXXXX NSMakeXXXX NSRect nr1= NSMakeRect(10, 10, 50, 50); NSLog(@"nr1 = %@",NSStringFromRect(nr1)); } return 0; }
4.NSNumber
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //在OC中,集合中不能保存基本数据类型 //只能保存对象 //所以,一些基本数据类型数据需要包装成 对象,然后才能保存到数组中 //NSNumber 用来把C中数值型(int double float)基本数据类型的数据包装成对象 //NSArray *arr = [NSArray arrayWithObjects:10, nil]; //1、NSNumber 对象的创建 //把int型的10 包装成 对象(NSNumber类型的对象) NSNumber *n1 = [NSNumber numberWithInt:10]; //2、简写的写法 NSNumber *n2 = @20; int a = 100; NSNumber *n3 = @(a); //包装变量 //把n1存到数组中 NSArray *arr = [NSArray arrayWithObjects:n1,n2,n3, nil]; NSLog(@"%@",arr); //取出包装前的基本数据类型的值 //从NSNumber 对象中获取基本数据类型的值,通过xxxValue int num1 = [n1 intValue]; NSLog(@"%d",num1+20); //遍历 [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { //obj + 10 //错误的 int num = [obj intValue]+10; NSLog(@"num = %d",num); }]; //字典中使用 //pno pname // 1 月饼炒辣椒 // 2 葡萄炒西瓜 // 3 爆炒妙脆角 NSMutableDictionary *productDict = [NSMutableDictionary dictionary]; for (int i=1; i<=3; i++) { //向字典中设置值 [productDict setValue:[NSString stringWithFormat:@"月饼炒辣椒%d" ,i] forKey:[NSNumber numberWithInt:i]]; } NSLog(@"%@",productDict); } return 0; }
5.NSValue
#import <Foundation/Foundation.h> void test(){ //创建一个结构体变量,保存点 // p1 是 CGPoint 类型的结构体变量 CGPoint p1 = CGPointMake(20, 50); NSRect r1 = NSMakeRect(0, 0, 200, 100); //创建数组 NSMutableArray *arr = [NSMutableArray array]; //p1 ---> obj //valueWithPoint 把结构体转换为NSValue对象 NSValue *pointVal = [NSValue valueWithPoint:p1]; //把对象存放到数组中 [arr addObject:pointVal]; [arr addObject:[NSValue valueWithRect:r1]]; NSLog(@"arr = %@",arr); //取出r1的值 // rectValue 从NSValue对象中,取得NSRect类型的值 NSValue *r1Val = [arr lastObject]; NSRect r2 = [r1Val rectValue]; NSLog(@"%@",NSStringFromRect(r2)); } typedef struct D{ int year; int month; int day; } MyDate; //MyDate是一个别名 int main(int argc, const char * argv[]) { @autoreleasepool { // 保存 一个 年月日 // 2015-5-7 MyDate md = {2015,5,7}; // md -----> obj //@encode(MyDate) 作用,把MyDate类型生成一个常量字符串描述 NSValue *val = [NSValue valueWithBytes:&md objCType:@encode(MyDate)]; //定义一个数组,把val存到数组中 NSMutableArray *arr = [NSMutableArray arrayWithObject:val]; //从数组中取出来NSValue对象 //从对象中,取出结构体变量的值 // 传入一个结构体变量的地址 MyDate tmd; // getValue获取结构值,保存到结构体变量tmd [val getValue:&tmd]; NSLog(@"%d,%d,%d",tmd.year,tmd.month,tmd.day); } return 0; }
6.NSDate
/* NSDate 是OC中提供日期时间处理的一个类 1)获取当前的时间 NSDate *d1 = [NSDate date]; //创建一个时期时间对象 2)格式化显示时间 3)计算时间() 4)日期时间对象的使用 */ #import <Foundation/Foundation.h> void test(){ //创建一个日期时间对象 //获取当前时间 NSDate *d1 = [NSDate date]; NSLog(@"%@",d1); //格式化日期 //NSDateFormatter 日期格式化 NSDateFormatter *formatter = [NSDateFormatter new]; //设置日期的显示格式的 // yyyy 表示四位的年份 // MM 表示2位的月份 // dd 表示2位的天数 // HH 表示24小时制得小数 hh - 12小时值 // mm 表示2位的分钟数 // ss 表示2位的秒数 formatter.dateFormat = @"yyyy年MM月dd日 HH:mm:ss"; formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"; //格式化日期 NSString *dateStr = [formatter stringFromDate:d1]; NSLog(@"%@",dateStr); } void test2(){ NSDateFormatter *formatter = [NSDateFormatter new]; //设置日期的显示格式的 // yyyy 表示四位的年份 // MM 表示2位的月份 // dd 表示2位的天数 // HH 表示24小时制得小数 hh - 12小时值 // mm 表示2位的分钟数 // ss 表示2位的秒数 formatter.dateFormat = @"yyyy年MM月dd日 HH:mm:ss"; formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"; //计算明天的此刻 // 距现在时间 24 小时以后,明天的此刻 NSTimeInterval t = 60*60*24; NSDate *tom = [NSDate dateWithTimeIntervalSinceNow:t]; NSDate *zuotian = [NSDate dateWithTimeIntervalSinceNow:-t]; //格式化显示时间 NSString *timeStr = [formatter stringFromDate:zuotian]; NSLog(@"timeStr = %@",timeStr); //计算昨天的时间 NSDate *now = [NSDate date]; //当前时间-24小时的秒数 NSDate *zt = [now addTimeInterval:-t]; timeStr = [formatter stringFromDate:zt]; NSLog(@"zt = %@",zt); } int main(int argc, const char * argv[]) { @autoreleasepool { // NSCalendar 日期类,可以帮我们快速的获取年月日 时分秒信息 NSDate *d = [NSDate date]; //创建日期的对象 NSCalendar *cal = [NSCalendar currentCalendar]; // cal components:获取日期的哪些部分 fromDate:日期对象 NSDateComponents *coms = [cal components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:d]; NSLog(@"year:%ld,month:%ld,day:%ld",coms.year,coms.month,coms.day); } return 0; }
7.集合对象的内存管理
#import <Foundation/Foundation.h> #import "Person.h" void test(){ //创建对象 Person *p = [Person new]; //1 [p retain]; //2 //定义一个数组,并且把p放到数组中 // 规律1: // 只要把对象放到数组中,就发现对象的引用计数+1 // NSArray *arr = [NSArray arrayWithObject:p]; // [[[self alloc] init] autorelease]; NSMutableArray *marr = [NSMutableArray array]; [marr addObject:p]; NSLog(@"p.retainCount = %lu",p.retainCount); //3 [p release]; // 2 // 规律2: // 数组在销毁的时候,对对象发送了一次release消息 // 销毁的顺序:数组先挂 --> 数组向其中的对象也发送release // 结论: // 1) 当对象被添加到数组中的时候,对象的引用计数+1 // 2) 当数组销毁的时候,数组会向它其中的元素发送一次release消息 // 注意: 数组被销毁了,它里面存储的对象不一定被销毁 } int main(int argc, const char * argv[]) { @autoreleasepool { //创建对象 Person *p = [Person new]; //1 NSMutableArray *arr = [[NSMutableArray alloc] init]; [arr addObject:p]; //2 // [arr addObject:p]; //如果对象从数组中移除了,对象的引用计数会被-1 [arr removeObject:p]; //-1 NSLog(@"%lu",p.retainCount); [arr release]; //1 [p release]; // 1 //数组被销毁了 } return 0; }