【OC语言】第十篇·NSFileManager、NSDate、沙盒、copy以及单例模式

本文探讨了如何使用NSFileManager进行文件管理,包括检查文件是否存在、判断是否为目录、验证文件读写权限以及删除文件的能力。通过实例展示了在iOS中如何操作文件路径如'/Users/Mac-leaf/Desktop/arr.plist'和系统根目录'/'。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、NSFileManger
     1. NSFileManager的目录属性用法:

NSString *filePath = @"/Users/Mac-leaf/Desktop/arr.plist"; NSString *filePath2 = @"/"; //系统根目录(只读) // 1) 判断文件是否存在 //创建文件管理对象,调用defaultManager 创建一个文件管理的单例对象 //单例对象:在程序运行期间,只有一个对象存在 NSFileManager *fm = [NSFileManager defaultManager]; 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);

    2. 文件属性和目录遍历用法:

//创建文件对象 NSFileManager *fm = [NSFileManager defaultManager]; NSString *filePath = @"/Users/Mac-leaf/Desktop/arr.plist"; NSString *dirPath = @"/Users/Mac-leaf/Desktop/arr"; //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);

    3.文件操作:

//创建文件管理对象 NSFileManager *fm = [NSFileManager defaultManager]; //创建目录 NSString *createDirPath = @"/Users/Mac-leaf/Desktop/a/b/c/f.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 = @"写入文件测试"; NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; BOOL isYes;

//fm createFileAtPath:@"路径" contents: NSData类型的数据 attributes:文件的属性的字 isYes = [fm createFileAtPath:createDirPath contents:data attributes:nil]; NSLog(@"isYes = %d",isYes); //如何copy文件 NSString *targetPath = @"/Users/Mac-leaf/Desktop/a/b/f.txt"; [fm copyItemAtPath:createDirPath toPath:targetPath error:nil]; NSString *targetPath = @"/Users/Mac-leaf/Desktop/a/f.txt";  

//如何移动文件 [fm moveItemAtPath:createDirPath toPath:targetPath error:nil]; //如何删除文件 [fm removeItemAtPath:targetPath error:nil];


二、 沙盒
    1.  文件系统: 每个应用程序都有自己的沙盒(iOS中每个应用程序,只能访问自己的沙盒),iOS8开始开放了几个固定区域。
    2. 沙盒包含内容:
       应用程序包
        Documents                   持久化的数据
        tmp                                临时目录
        Library\cache               缓存
        Library\Preferences     配置信息\SQLite
    3. 沙盒路径获取的方法:
      1)沙盒的路径:NSHomeDirectory()
      2)Documents目录:
          //NSSearchPathForDirectoriesInDomains 返回绝对路径
         //NSSearchPathForDirectoriesInDomains(要查找的目录, 是否是用户主目录, YES/NO 是否获取全路径)
         //NSDocumentDirectory 表示获取沙盒的Documents目录

三、常见的结构体
    1. NSPoint是CGPoint的一个别名
      1)用来 表示二维平面的一个 点
      2)包含两个成员 x(点的x方向)  y(y方向)
    2. CGSize和NSSize
      1)用来表示平面的面积(大小)
      2)width (宽)  height(高)
    3. CGRect 和 NSRect
      1)表示在平面上左上角是某个点的矩形区域
      2)origin 表示 矩形的左上角的点
      3)size   表示 矩形的大小

四、NSNumber和NSValue
    1. NSNumber 是OC中处理数值类型的一个类。即:把 int /float /double  包装成一个对象。
    2. 使用NSNumber的好处:可以把基本数据类型的数据,保存到数组或者字典中。
    3.  NSNumber是NSValue的一个子类。一个NSValue对象就是用来存储一个C或者OC数据的简单容器,它可以保存任意类型的数据,就是允许将各种数据类型的数据结构被添加到集合中。

五、NSDate
    1. NSDate 是OC中提供日期时间处理的一个类
    2. 获取当前时间的用法

//获取当前时间 NSDate *d1 = [NSDate date]; //默认是0时区时间,北京东8区 //格式化日期: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"; //格式化日期 NSString *dateStr = [formatter stringFromDate:d1]; NSLog(@"%@",dateStr);

    3. 日期计算

NSDateFormatter *formatter = [NSDateFormatter new]; formatter.dateFormat = @"yyyy年MM月dd日 HH:mm:ss"; //计算明天的此刻,距现在时间24小时以后,明天的此刻 NSTimeInterval t = 60*60*24; NSDate *tom = [NSDate dateWithTimeIntervalSinceNow:t]; //明天 NSDate *yest = [NSDate dateWithTimeIntervalSinceNow:-t]; //昨天 //格式化显示时间 NSString *timeStr = [formatter stringFromDate:yest]; NSLog(@"timeStr = %@",timeStr); //计算昨天的时间(不常用) NSDate *now = [NSDate date]; //当前时间-24小时的秒数 NSDate *zt = [now addTimeInterval:-t]; timeStr = [formatter stringFromDate:zt]; NSLog(@"zt = %@",zt);

    4. 获取日期

NSDate *d = [NSDate date]; //创建日期的对象:NSCalendar 日期类,可以帮我们快速的获取年月日 时分秒信息 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);


六、集合对象的内存管理
    1. 规律1:只要把对象放到数组中,就发现对象的引用计数+1
        规律2:数组在销毁的时候,对对象发送了一次release消息
    2. 销毁的顺序:数组先挂 --> 数组向其中的对象也发送release
    3. 结论:
      1)当对象被添加到数组中的时候,对象的引用计数+1
      2)当数组销毁的时候,数组会向它其中的元素发送一次release消息
      3)数组被销毁了,它里面存储的对象不一定被销毁

七、Copy
    1. 对象拷贝的目的:要使用某个对象的数据,但是在修改对象的时候不影响原来对象的内容。
    2. 作用:利用源对象产生一个副本对象
    3. 特点:修改副本对象的属性和行为不会影响源对象
                    修改源对象的属性和行为不会影响副本对象
    4. 不可变的对象copy :产生的是不可变的
        不可变的对象mutableCopy:产生的是可变的对象
    5. 可变对象copy :产生的是不可变的
        可变的对象mutableCopy:产生的是可变的对象
    6. 不可变的对象,进行了copy以后,没有重新分配内存空间,这是浅拷贝只是拷贝了地址,并没有真正的分配新的内存空间。源对象引用计数 +1,副本对象指向源对象,引用计数也增加了。
    7.  mutableCopy 分配一个新的空间,这就是一个深拷贝。
      1)开辟一个新的空间,存储副本对象
      2)副本对象的引用计数为1
    8. 自定义类实现copy的功能:
      1)创建一个类
      2)遵守NSCopying协议
      3)实现协议中声明的方法
      4)[对象 copy];
      目的:产生一个副本对象

八、单例模式
    1. 单例模式:对象在任何时候都只有一个,好处是在多个类之间共享数据。
    2. 设计要点:
      1)保证唯一:程序运行期间必须唯一
      2)单例类:必须提供一个接入点(特殊的类方法)
   3. 一个单例类的.m文件固定写法:
#import "SingletonTools.h"
//定义一个全局变量
static SingletonTools *instances = nil;
@implementation SingletonTools


-(id)copyWithZone:(NSZone*)zone{
    return self;
}


+(id)allocWithZone:(NSZone*)zone{
    //线程保护
    @synchronized(self) {
        if (instances == nil) {
            //调用父类的alloc
            instances = [super allocWithZone:zone];       
            return instances;
        }     
    }
     return instances;
}


-(id)retain{
    return self;
}


-(NSUInteger)retainCount{
    return NSUIntegerMax;
}


-(oneway void)release{
}


-(id)autorelease{
    return self;
}


//单例的接入点方法
+(instancetype)shareInstances{
    //目的:保证对象必须唯一
    if(instances == nil){       
        //创建一个对象
        instances = [[SingletonTools alloc] init];
        return instances;
    }
    return instances;
}


@end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值