黑马程序员-[OC语言] 第八篇:foundation框架之 NSFileManager、NSDate概述

OC加强--第五天学习总结

1.NSFileManager介绍

NSFileManager是用来管理文件系统的。它可以用来进行常见的文件/文件夹操作。

NSString*filePath=@”/users/xiaobai/desktop/strong.plist”;

   1)判断文件是否存在

<span style="font-size:18px;">  NSFileManager *fm=[NSFileManagerdefaultManager];//创建一个文件管理对象。

      BOOL isYES=[fmfileExistsAtPath:filePath];  //判断文件是否存在

      BOOL isDir;

      [fm fileExistsAtPath:filePath isDirectory:&isDir];//判断是否是目录</span>

   2)判断文件是否可读

      [fm isReadableFileAtPath;filePath];

   3)判断文件是否可写

      [fm isWritableFileAtPath;filePath];

   5)判断文件是否可删除

      [fm isDeletableFileAtPath;filePath];//返回的是BOOL型


2.NSFileManager用法深入(一)

      NSFileManager *fm=[NSFileManagerdefaultManager];

     1)如何获取文件的信息(属性)

      NSDictionary *dic=[fmattributesOfItemAtPath:filePath  error:nil];

     2)获取指定目录下的文件及子目录

<span style="font-size:18px;"> NSArray *arr=[fmsubpathsAtPath:dirPath];//使用递归的方式,获取当前目录及子目录下的所有文件及文件夹

      Arr=[fm subpathsOfDirectoryAtPath:dirPatherror:nil];//不是使用递归的方式获取的,建议使用。

</span>

     3)获取指定目录下的文件及目录信息(不在获取后代路径)

     Arr= [fm contenesOfDirectortyAtPath;dirPatherror:nil];


3.NSFileManager 用法深入(二)

     1)如何创建目录

<span style="font-size:18px;"> NSString *createDirPath=@”/Users/xiaobai/desktop/aaa”;

     [fm createDirectoryAtPath:createDirPathwithIntermediateDirectories:NO attributes:nil error:nil];  ---->withIntermediateDirectories:YES表示自动创建目录中缺少的目录

          ---->attributes:nil  表示属性的字典为空</span>

     2)如何创建文件

<span style="font-size:18px;">   [fm createFileAtPath:@”路径” contents:NSData类型的数据  attributes:文件的属性的字典];

      NSString *str=@”guoyuanyua”;

     //如何创建NSData?  是一个处理二进制数据的类

      NSData *data=[str dataUsingEncoding:NSUTF8StringEncoding];

      [fm createFileAtPath:createDirPathcontents:data  attributes:nil];//返回bool型</span>

     3)如何copy文件

     

<span style="font-size:18px;">NSString * targetPath=@”/Users/xiaobai/desktop/aaa/xx.plist”;

      NSString *createDirPath=@”/Users/xiaobai/desktop/xx.plist”;

      [fm copyItemAtPath:createDirPath  toPath:targerPath error:nil];</span>

      4)如何移动文件

      [fm moveItemAtPath:createDirPathtoPath:targetPath error:nil];

       5)如何删除文件

      [fmremoveIntemAtPath:targetPath error:nil];


4.ios沙盒(sandbox)机制及获取沙盒路径

  1)沙盒的基本概念和作用

      每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用的文件系统隔离,ios系统不允许 访问其他应用的应用沙盒。在ios8中已经开放访问(extension)

  2)沙盒包含

     应用程序包:包含所有的资源文件和可执行文件

     Documents:保存应用运行时生成的需要持久化的数据,iTunes会自动备份该目录。

     Tmp:保存应用运行时所需的临时数据,使用完毕后在将相应的文件从该目录上删除。

     Library:存储程序的默认设置和其他状态信息,iTunes会自动备份该目录

     Libaray/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会再应用退出删除。

     Libarary/Preferences:保存应用的所有偏好设置。

  3)获取目录

     NSSearchPathForDirectoriesInDomains()返回一个绝对路径用来存放我们需要存储的文件 

     第一个参数:要获取的沙盒文件夹名称

     第二个参数:

     NSUerdomainMask=1//用户主目录中

     NSLocaldomainMask=2//当前机器中

     NSNetworkDomainMask=4//网络中可见的主机

     NSSystemDomainMask=8//系统目录,不可修改

     NSAllDomainsMask=0x0ffff//全部

     第三个参数:YES/NO  是否获取全路径

     1.获取分目录

<span style="font-size:18px;"> NSString*sandBoxPath=NSHomeDirectory();   

     2.Document

     NSArray *path=

    NSSearchPathForDirectoriesInDomains(NSDovunentDiretory,NSUserDomainMask,YES);</span>


     3.在Document目录下创建新的文件夹test

<span style="font-size:18px;"> NSArray *arr=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

 NSString *str=[[arr lastObject]stringByAppendingPathComponent:@”test/a.txt”];</span>
5.常见的结构体:
1) NSPoint是CGPoint的一个别名
        //用来 表示二维平面的一个 点
        //包含两个成员 x(点的x方向)  y(y方法)
OC中特有的赋值方式
        CGPoint c4 = CGPointMake(10, 10);
        NSPoint np2 = NSMakePoint(5, 5);
2)CGSize和NSSize
OC中特有的方式
        CGSize s2 = CGSizeMake(100, 100);
        NSSize ns = NSMakeSize(10, 10);
2)CGRect 和 NSRect
        //  表示在平面上左上角是某个点的矩形区域
        // origin 表示 矩形的左上角的点
        // size   表示 矩形的大小
OC特有的方式
        // CGXXXX     CGXXXXMake
        CGRect r3 = CGRectMake(10, 10, 100, 30);
        // NSXXXX     NSMakeXXXX
        NSRect nr1= NSMakeRect(10, 10, 50, 50);
NSLog(@"nr1 = %@“,NSStringFromRect(nr1));

6.NSNumber的介绍和作用

      NSArray/NSDictionary中只能存放oc对象,不能存放基本数据  类型,如果非要存,需要先把基本数据类型包装成oc对象。

      NSNumber可以把基本数据类型包装成对象,这样就可以间接将基本数据类型存放进     NSArray/NSDictionary中。

      转换方法:

       +(NSNumber *)numberWithInt:(int)value;

       +(NSNumber *)numberWithFloat:(float)value

       +(NSNumber *)numberWithdouble:(double)value

      1)基本数据类型转换成oc类型

   例1:int a=10;

   NSNumber *intobj=[NSNumber numberWithInt:a ];

   NSMutableArray *arr=[NSMutableArray arrayWithobjects:intobj,nil];

        例2:@(变量名)-->把基本数据类型包装成NSNumber类型

          @数值  --->把数值包装成NSNumber对象

       2)Oc类型转换成基本数据类型

         NSNumber *n1=array[0];

    Int a1=[n1 intValue];


7.NSValue的介绍和使用

       NSNumber是NSValue的子类,NSValue主要用来把指针,CGRect等包装成OC对象,以便存储。

       NSValue类的目标就是允许将pointers,struct,object,id.enum数据类型的数据结构能够被添加到集合里。


        例:

            CGPoint p1=CRPointMake(34,4);

            NSMutableArray *arr=[NSMutableArrayarray];

            NSValue *pointval=[NSValuevaluewithpoint:p1];

            [arr  addobjec:pointval];

          读取:

                NSValue *r1val=[arr lastobject];

                NSRect r2=[r1val rectvalue];

                NSLog(@”%@”,[NSStringFromRect:r2]);

       例:

typedef struct{

             Int year;

             Int month;

             Int day;

  }myData;

Void main(){

       myData md={2015,12,3};

       @encode(myData)作用,把myData类型生成一个常量字符串描述

       NSValue *val=[NSValue valueWithBytes:&mdobjCType:@encode(myData)];

       //定义一个数组,把val存到数组中

       NSMutableArray*arr=[NSMutableArray array];

       [arr addobject:val];

       //从数组中取出来NSValue对象

       //从对象中,取出结构体变量的值

       //传入一个结构体变量的地址

       myData tmd;

       [valgetValue:&tmd];//getvalue获取结构值,保存到结构体变量tmd

       NSLog(@”%d,%d,%d”,tmd,year,tmd.month,tmd.day);


8.NSDate的介绍和使用

NSDate可以用来表示时间,可以进行一些常见的日期/时间处理

一个NSDate对象就代表一个时间此时时间是0时区,换算成我们的时间要+8

      [NSDate date];返回的就是当前时间

      1)格式化日期:NSDateFormatter

       设置日期的显示格式:

       yyyy表示四位的年份

       MM表示2位的月份

       dd表示2位的天数

<span style="font-size:18px;"> NSDate *d1=[NSDatedate];

         NSDateFormatter*formatter=[NSDateFormatter new];

        Formatter.dateformat=@”yyyy-MM-dd HH:mm-ss”;

         NSString*datestr=[formatter stringfromdate:d1];

         NSLog(@”%@”,datestr);</span>

       HH表示24小时制的小数  hh  12小时制的

       mm表示2位的分钟数

       ss表示2位的秒数

       

       2)计算日期

         计算明天的此刻时间

<span style="font-size:18px;">NSDateFormatter*formatter=[NSDateFormatter new];

        formatter.dateformat=@”yyyy-MM-ddHH:mm-ss”;

              NSTimeIntervalt=60*60*24;

        NSDate *tom=[NSDatedateWithTimeIntervalSinceNow:t];

        NSString*str=[formatter sringfromdate:tom];</span>

        3)日期时间对象

            结合NSCalendar和NSDate能做更多的日期、时间处理

        例:

<span style="font-size:18px;">NSCalendar *ca=[NSCalendarcurrentCalendar];

            NSDate *d=[NSDatedate];

            NSDateComponents*cms=

[cacomponents:NSCalendarUnitYear|NSCalendarUintMonth|NSCalendarUintDayfromDate:d];

            NSLog(@”%ld-%ld-%ld”,cms.year,cms.month,cms.day;</span>

9.集合内存管理

      1)当把一个对象添加到集合中时,这个对象会做一次retain操作,技术器会+1

      2)当一个集合被销毁时,会对集合里面的所有对象做一次release操作,计数器会-1;

      3)当一个对象从集合中移除时,这个对象会一次release操作,计数器会-1


   10.copy的介绍和使用

      不可变的对象(NSString ,Array ,Dictionary)被copy复制后也是不可变的被mutablecopy之后是可变的


      可变的对象(MutableaNSString,MutableArray,MutableDictionary)被复制mutablecopy后是可变的。被copy之后产生不可变的对象。

      进行了copy以后,没有重新的分配内存空间, 这是浅拷贝。只是拷贝了地址,并没有真正的分配新的内存空间。源对象和副本对象是同一个对象,源对象应用计数+1.

      MutableCopy分配一个新的空间,这是一个深拷贝,开辟一个新的空间,存储副本对象,副本对象引用计数+1,源对象引用计数不变。


     11.@property内存管理策略

      1.非ARC

        1)copy:只用于NSString\block

        2)retain:除NSString\block以外的oc对象

        3)assign:基本数据类型,枚举,结构体(非oc对象),当2个对象相互引用,一端用retain,一端用assign

       2.ARC

         1)copy:只用于NSString\block

         2)strong:除NSString\block以外的oc对象

         3)week:当2个对象相互引用,一端用strong  一端用weak

         4)assign:基本数据类型,枚举,结构体(非oc对象)


   12.为自定义的类实现copy操作

       1.调用copy其实就是调用copyWithZone方法,所以要实现copyWithZone方法。

       2.copyWithZone方法返回值类型是id类型,需要返回一个对象的副本。

       3.不管对象可变或不可变,只要实现CopyWithZone方法即可。

 

单例模式概念

  单例模式的意图是类的对象成为系统中唯一的实例,提供一个访问点,供客户类共享资源。

  单例设计模式的要点:

      1.某个类只能有一个实例;

      2.他必须自行创建这个对象

      3.必须自行向整个系统提供这个实例。

      4必须定义一个接口(类方法)。

      5.为了保证实例的唯一性,我们必须将

<span style="font-size:18px;"> -(id)copywithzone:(NSZone *)zone{  retrurn self;  }

     +(id)allocwithzone:(NSZone *)zone {

                    @synchronized(self){   //线程保护,只允许一个访问

            If(instances==nil){

                 Instances=[super allocwithzone:zone];

                  Returninstances;

                 }

           }

        Return instances;

    }

          

      -(id)retain {  return self; }

     -(NSUinteger)retaincount{  returnNSUIntegerMax; }

      -(oneway void)release

      -(id)autorelease{  return self; }</span>


     


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值