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

 

posted @ 2015-10-29 13:50  ios开发那点事  阅读(357)  评论(0编辑  收藏  举报