Foundation

——————————————————————————————

  NSFileManager OC中一个文件管理的类

    作用: 可以判断文件的存在\可读写\可删除移动 复制  删除  创建目录

 

 

    1) 基本使用

 

       判断文件的状态

 

       NSFileManager  *fm = [NSFileManager defaultManager];

 


    //基本使用


    NSFileManager *fm = [NSFileManager defaultManager];


    //定义要检测的文件或文件夹的路径

    NSString *filePath = @"/Users/apple/Desktop/1.txt";


    // 1)判断文件是否存在

    BOOL isYes = [fm fileExistsAtPath:filePath];


    // 2)如果文件存在了,它使一个目录还是一个具体的文件


    BOOL isDir; //用于判断是否是一个目录


    isYes = [fm fileExistsAtPath:filePath isDirectory:&isDir];

    if (isYes) {

      NSLog(@"文件存在");

      if (isDir) {


        NSLog(@"这是一个目录");

      }

    }


    // 3)文件是否可读


    isYes = [fm isReadableFileAtPath:filePath];


    //  "/usr/"

    filePath = @"/usr/";

    // 4)文件是否可写

    isYes = [fm isWritableFileAtPath:filePath];


    // 5)文件是否可以删除

    isYes = [fm isDeletableFileAtPath:filePath];


    NSLog(@"isYes = %d", isYes); // 1 存在    0 不存在

  }



——————————————————————————————




//获取文件信息

void test1() {


  //基本使用

  //创建文件管理对象

  NSFileManager *fm = [NSFileManager defaultManager];


  //定义文件的路径

  NSString *filePath = @"/Users/apple/Desktop/1.txt";

  //定义错误对象

  NSError *err = nil;

  //如果 errnil 表示读取的过程中没有发生错误

  //        不等于nil 出错了

  //

  NSDictionary *dict = [fm attributesOfItemAtPath:filePath error:&err];


  if (err) {


    //出错了

    NSLog(@"出错了:%@", err);

  } else {


    NSLog(@"读取成功!");

    NSLog(@"%@", dict);

    NSLog(@"文件创建时间:%@", dict[@"NSFileCreationDate"]);

  }

}

int main(int argc, const char *argv[]) {

  @autoreleasepool {


    //基本使用

    //创建文件管理对象

    NSFileManager *fm = [NSFileManager defaultManager];


    //定义文件的路径

    NSString *dirPath = @"/Users/apple/Desktop/aaa";


    //获取一个目录的子目录及文件方式1

    //以递归的方式获取

    NSArray *paths = [fm subpathsAtPath:dirPath];


    //非递归的方式 方式2

    paths = [fm subpathsOfDirectoryAtPath:dirPath error:nil];


    /*

     bbbb,

     "bbbb/1.txt",

     ccc

     */


    //只获取当前目录下的文件及目录,但是不获取子目录下的子路径

    paths = [fm contentsOfDirectoryAtPath:dirPath error:nil];


    NSLog(@"paths = %@", paths);

  }

  return 0;

}


—————————————————————————————



    //创建文件管理对象

    NSFileManager *fm = [NSFileManager defaultManager];


    //创建一个文件

    // 1)要写入的文件内容

    NSString *

        str = @"大学生 = 吃饭+睡觉+谈恋爱; = 吃饭+睡觉 大学生= "

              @"+谈恋爱; 大学生-谈恋爱 = ?";


    // 2)文件保存的位置(路径)

    NSString *filePath = @"/Users/apple/Desktop/love.txt";


    // NSSting ----> NSData

    // NSData  OC中处理data二进制数据的类

    // dataUsingEncoding 把字符串按照一定的编码格式,转换为 NSData

    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];


    // 1)创建文件

    BOOL isYes;

    // isYes = [fm createFileAtPath:filePath contents:data attributes:nil];

    // 2)拷贝文件

    // 目标地址

    NSString *goalPath = @"/Users/apple/Desktop/aaa/ccc/love.txt";


    //        fm copyItemAtPath:@"原文件所在路径" toPath:@"目标路径" error:nil

    // isYes = [fm copyItemAtPath:filePath toPath:goalPath error:nil];


    // 3)移动一个文件

    // isYes = [fm moveItemAtPath:filePath toPath:goalPath error:nil];


    // 4)删除一个文件

    isYes = [fm removeItemAtPath:goalPath error:nil];


    // 5)可以创建目录

    NSString *dirPath = @"/Users/apple/Desktop/ddd/ccc/aaa/1.txt";

    //        withIntermediateDirectories:YES   路径中不存在的目录,会自动创建

    //                                    NO    路径中不存在的目录,不会自动创建

    //        fm createDirectoryAtPath:@"路径"

    //        withIntermediateDirectories:YES/NO attributes:属性的字典

    //        error:错误对象


    isYes = [fm createDirectoryAtPath:dirPath

          withIntermediateDirectories:YES

                           attributes:nil

                                error:nil];


    if (isYes) {

      NSLog(@"操作成功!");

    }

  }

  return 0;





——————————————————————————————



 沙盒,一个特殊的文件夹

    iOS中每个应用程序都有自己的一个沙盒

    iOS系统限定,每个程序只能访问自己的沙盒


    //沙盒的路径:


    // 1) 获取沙盒的根目录



    // 2) 获取沙盒中的临时文件夹目录



    // 3) 获取 沙盒中 Documents



    // 4) 获取 沙盒中 Library



    // 5) 获取 沙盒中 Library 中的 caches


 */


#import <Foundation/Foundation.h>


int main(int argc, const char *argv[]) {

  @autoreleasepool {


    // 1) 获取沙盒的根目录

    // Mac下路径: 用户的家目录

    // iOS路径

    /// Users/apple/Library/Developer/CoreSimulator/Devices/0B364173-7C28-4376-84F4-671126E16FAD/data/Containers/Data/Application/E5E6C4E7-B046-40B5-894E-501DB56EA3C9


    NSString *homePath = NSHomeDirectory(); // NSHomeDirectory 沙盒的根目录

    NSLog(@"homePath = %@", homePath); //  "/"


    // 2) 获取沙盒中的临时文件夹目录

    // /Users/apple/Library/Developer/CoreSimulator/Devices/0B364173-7C28-4376-84F4-671126E16FAD/data/Containers/Data/Application/0A45EA85-E40D-473C-83B9-2E80325ED4E8/tmp/

    NSString *tempPath = NSTemporaryDirectory();

    NSLog(@"tempPath = %@", tempPath);


    // 3) 获取 沙盒中 Documents

    // NSSearchPathForDirectoriesInDomains 用来搜索一个绝对路径

    // 第一个参数: 表示要获取的是那个路径

    // 第二个参数: 搜索的范围

    // 第三个参数: 是否要返回绝对路径

    //        NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory

    //        directory,

    //        <#NSSearchPathDomainMask domainMask#>, <#BOOL expandTilde#>)


    //  NSUserDomainMask在用户的主目录中获取

    // NSDocumentDirectory 获取沙盒中的documents

    // NSLibraryDirectory 获取沙盒中的Library目录

    // NSCachesDirectory


    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,

                                                         NSUserDomainMask, YES);


    NSString *path = [paths lastObject];

    NSLog(@"path = %@", path);


    //


    // 4) 获取 沙盒中 Library


    // 5) 获取 沙盒中 Library 中的 caches

  }

  return 0;




——————————————————————————————


void test() {


  //常见的结构体

  // CGPoint  表示平面的一个点    NSPointCGPoint的一个别名


  CGPoint p1; //定义一个CGPoint类型的变量


  //给结构体变量赋值

  p1.x = 23;

  p1.y = 100;


  NSLog(@"%.2f,%.2f", p1.x, p1.y);


  //一大波的初始化方式

  CGPoint p2 = {100, 100};

  NSPoint p3 = {10, 20};

  NSPoint p4 = {.x = 10};

  NSPoint p5 = NSMakePoint(10, 23);

  CGPoint p6 = CGPointMake(10, 10);


  // NSStringFromRange

  NSLog(@"%@", NSStringFromPoint(p6));

}


void test2() {


  // CGSize/NSSize的使用

  //用来表示一个尺寸 包含 宽度和 高度 尺寸


  CGSize s1 = {20, 60};

  CGSize s2 = {.width = 100};


  // CGxxxx赋值  CGXXXXMake();

  CGSize s3 = CGSizeMake(30, 100);


  // NSXXXX赋值  NSMakeXXXX();

  NSSize s4 = NSMakeSize(30, 100);


  NSLog(@"%@", NSStringFromSize(s2));

}


int main(int argc, const char *argv[]) {

  @autoreleasepool {


    // CGRect 表示具有位置信息的矩形

    // 位置   通过点来定位

    // 矩形   通过宽度和高度 来限定


    //用来表示一个尺寸 包含 宽度和 高度 尺寸


    // CGxxxx赋值  CGXXXXMake();

    CGSize s3 = CGSizeMake(30, 100);


    // NSXXXX赋值  NSMakeXXXX();

    NSSize s4 = NSMakeSize(30, 100);


    CGRect c1 = {{10, 20}, {50, 50}};

    CGRect c2;

    c2.origin.x = 10;

    c2.origin.y = 100;


    c2.size.width = 80;

    c2.size.height = 100;


    CGRect c3 = CGRectMake(20, 12, 30, 30);

    NSRect c4 = NSMakeRect(10, 10, 20, 20);


    NSLog(@"%@", NSStringFromRect(c4));

  }

  return 0;

}






——————————————————————————————


    // 10 基本数据类型的数据

    // OC的数组中只能存放对象类型

    // 要想把基本数据类型的数据,存储到数组中,必须先把基本数据类型的数据

    // 包装成OC的对象

    // 1)NSNumber  就是 专业 把基本数据类型的数据 包装 OC对象


    // @"10"  ----> int


    // 2)如何把基本数据类型转为NSNumber对象类型

    int a = 10;

    float f1 = 3.4f;

    double d1 = 3.14;


    // int ---> OC对象

    NSNumber *numObj = [NSNumber numberWithInt:a];


    // float ---> OC对象

    NSNumber *floatObj = [NSNumber numberWithFloat:f1];


    // double --> OC对象

    NSNumber *doubleObj = [NSNumber numberWithDouble:d1];


    // NSNumber 的简化写法,把基本数据类型包装为OC的对象

    NSNumber *n1 = @10;


    int m = 80;

    //@(m) 把基本数据类型的变量快速的包装为NSNumber类型

    //@3.14 把一个浮点数,包装为 NSNumber

    //@YES 把一个BOOL类型的数据,包装为 NSNumber

    //@10  把数字10包装成 NSNumber


    NSArray *arr =

        @[ @"1", n1, @3.14, @(m), @YES, numObj, floatObj, doubleObj ];

    NSLog(@"arr = %@", arr);


    //取出数组的最后一个元素 + 10


    NSNumber *getObj = [arr lastObject]; //


    //NSNumber类型的OC对象,包装为基本数据类型的数据

    double d2 = [getObj doubleValue];


    NSLog(@"%.2f", d2 + 10);

  }

  return 0;

}







——————————————————————————————



  // NSRange     NSPoint   NSSize   NSRect

  NSRange r1 = {3, 10};

  //定义一个区域

  NSRect rect = NSMakeRect(30, 23, 60, 20);

  // 想办法把结构体存储到集合中

  // 1)NSValue 主要可以用于把结构体\指针存储到集合中


  // 2)如何把结构体利用NSValue存储到集合中


  NSValue *valObj = [NSValue valueWithRange:r1];

  NSValue *rectObj = [NSValue valueWithRect:rect];


  // NSValue对象,存到数组中了

  NSArray *arr = @[ valObj, rectObj ];


  NSValue *getObj = [arr lastObject];

  // NSValue ----> NSRect 类型


  NSRect rect2 = [getObj rectValue];

  NSLog(@"%@", NSStringFromRect(rect2)); //

}

int main(int argc, const char *argv[]) {

  @autoreleasepool {


    typedef struct {


      int year;

      int month;

      int day;


    } MyDate;


    // 给结构体变量 d1 赋值

    MyDate d1 = {2015, 11, 11};


    //假如: 把一个MyDate类型的结构体变量值存储到数组中

    // d1

    //         [NSValue valueWithBytes:待包装的结构体变量得地址

    //         objCType:类型的描述字符串]

    // 如何把一个类型---->生成一个类型描述的字符串

    // @encode(结构体的类型)

    NSValue *valObj = [NSValue valueWithBytes:&d1 objCType:@encode(MyDate)];

    NSArray *arr = @[ valObj ];


    //从数组中再取出来 d1

    NSValue *getObj = [arr lastObject];


    // NSValue 类型 中存储的d1的值取出来

    MyDate d2;

    // [getObj getValue:结构体变量B的地址]  //NSValue中取出结构体变量的值

    // 取出来以后,保存到结构体变量B


    [getObj getValue:&d2];


    NSLog(@"%d,%d,%d", d2.year, d2.month, d2.day);

  }

  return 0;

}







——————————————————————————————


    // NSDate 日期时间处理的类


    // 1)通过 [NSDate date];可以获取当前时间

    NSDate *now = [NSDate date];


    //默认打印的时间是 时区 0 的时间

    //北京时间 +0008

    NSLog(@"%@", now);


    // 2)日期时间的格式化

    // 2015-06-06 07:15:42 +0000

    // 20150606 151900


    // 日期时间格式化的一个类

    NSDateFormatter *formatter = [NSDateFormatter new];

    //设定格式化日期的格式

    // yyyy  -- 表示4位的年

    // MM    -- 表示2位的月

    // dd    -- 表示2位的日

    // HH    -- 24小时制,显示时间

    // hh    -- 12小时制,显示时间

    // mm    -- 显示2位的分钟

    // ss    -- 显示2位的秒数


    //                       2015-06-06 15:22:33

    //        formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";

    formatter.dateFormat = @"yyyyMMdd HHmmss";

    // now这个时间对象,按照formatter 的格式,格式化时间,并且返回字符串


    // 3)计算日期

    // 计算下,明天的此刻

    // +24   = 60 * 60 * 24

    //得到所有的秒数

    NSTimeInterval secs = 60 * 60 * 24;

    //创建一个date对象 d1 ,d1的时间,距现在 60*60*24,明天的此刻

    NSDate *d1 = [NSDate dateWithTimeIntervalSinceNow:secs];


    // 4) 计算昨天的此刻

    NSDate *d2 = [NSDate dateWithTimeIntervalSinceNow:-secs];

    NSDate *d3 = [NSDate date];

    NSDate *d4 = [d3 addTimeInterval:-secs];


    NSString *dateStr = [formatter stringFromDate:d4];


    NSLog(@"dateStr = %@", dateStr);


    // 5) 日期时间处理的类

    NSDate *d5 = [NSDate date];

    NSCalendar *cal = [NSCalendar currentCalendar];


    //获取年月日时分秒的每一部分

    // NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay 年月日

    NSDateComponents *coms = [cal

        components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay

          fromDate:d5];


    NSLog(@":%ld,:%ld,:%ld", coms.year, coms.month, coms.day);

  }

  return 0;






——————————————————————————————


// 集合对象的内存管理1

void test() {


  Car *bigBen = [Car new]; // 1

  Person *p = [Person new]; // 1


  //[p retain];       //2

  NSLog(@"1:bigBen.rc = %lu,p.rc = %lu", bigBen.retainCount, p.retainCount);


  //把对象放到数组中

  NSArray *arrs = @[ bigBen, p ];

  // 当把一个对象加入到数组中,那么这个对象的引用计数+1

  // 当集合 arrs 销毁的时候,集合会向集合中的每个元素发送一次release消息

  // 数组销毁的时候,数组中的对象一定会被销毁吗?

  // 不一定,要取决于对象的引用计数 (数组对象,只是发送一次release)

  NSLog(@"2:bigBen.rc = %lu,p.rc = %lu", bigBen.retainCount, p.retainCount);


  [bigBen release]; // 2--->1

  [p release]; // 2--->1

}


void test2() {


  Car *bigBen = [Car new]; // 1

  Person *p = [Person new]; // 1


  //[p retain];       //2

  NSLog(@"1:bigBen.rc = %lu,p.rc = %lu", bigBen.retainCount, p.retainCount);


  //把对象放到数组中

  NSMutableArray *arrs = [[NSMutableArray alloc] init];


  [arrs addObject:bigBen];

  [arrs addObject:p];

  // 当把一个对象加入到数组中,那么这个对象的引用计数+1

  // 当集合 arrs 销毁的时候,集合会向集合中的每个元素发送一次release消息

  // 数组销毁的时候,数组中的对象一定会被销毁吗?

  // 不一定,要取决于对象的引用计数 (数组对象,只是发送一次release)

  NSLog(@"2:bigBen.rc = %lu,p.rc = %lu", bigBen.retainCount, p.retainCount);


  [arrs release];


  NSLog(@"3:bigBen.rc = %lu,p.rc = %lu", bigBen.retainCount, p.retainCount);

  [bigBen release]; // 2--->1

  [p release]; // 2--->1


  //当集合被销毁的时候,会向其中的每个对象发送release消息

}


int main(int argc, const char *argv[]) {

  @autoreleasepool {


    Car *bigBen = [Car new]; // 1


    //把对象放到数组中

    NSMutableArray *arrs = [[NSMutableArray alloc] init];


    [arrs addObject:bigBen]; // 2

    NSLog(@"1:bigBen.rc = %lu", bigBen.retainCount);

    //如果执行了removeObject 操作,会使得引用计数-1


    [arrs removeObject:bigBen]; // 1

    NSLog(@"2:bigBen.rc = %lu", bigBen.retainCount);


    [arrs release]; //因为对象已经被移除,所以 ,不会再发送relesese消息给 bigBen


    [bigBen release]; // 1--->0


    //当集合被销毁的时候,会向其中的每个对象发送release消息

  }

  return 0;




——————————————————————————————



    copy 产生一个副本文件


    特点:

    修改源文件,不会影响副本文件

    修改副本文件,不会影响原文件


    OC中的对象的copy


    如果要拷贝一个对象(p car dog),需要调用 copy方法 或者 mutableCopy方法来实现


    如果我们想调用对象的copy方法,对象所属的类,必须遵守 NSCopying协议 不可变副本

    .................mutableCopy方法,    ...... NSMutableCopying    可变副本








 */


#import <Foundation/Foundation.h>

#import "Person.h"

int main(int argc, const char *argv[]) {

  @autoreleasepool {


    NSString *str = @"abc";

    // 1 不可变对象,进行了copy操作,产生的是一个不可变的对象

    NSString *str2 = [str copy]; //产生一个副本

    NSLog(@"str2 = %@", str2);


    // 2 不可变得对象,进行了mutableCopy 产生的是一个可变的副本

    NSMutableString *str3 = [str mutableCopy];

    [str3 appendString:@"hello"];


    //        NSString *str11 = [str3 mutableCopy];

    //        [(NSMutableString*)str11 appendString:@"hello"];

    //

    //        NSLog(@"str11 = %@,str3 = %@",str11,str3);


    // 3)一个可变的对象,如果进行了 copy操作,产生的是一个不可变的副本

    NSMutableString *str4 = [NSMutableString string];

    [str4 appendString:@"itcast"];

    // Attempt to mutate immutable object with appendString

    // 对一个不可变对象,执行了追加操作

    //[str5 appendString:@"beijing"];  //itcastbeijing

    //        NSMutableString *str5 = [str4 copy];


    // 4)一个可变的对象,如果进行了 mutableCopy操作,产生的是一个可变的副本

    NSMutableString *str6 = [str4 mutableCopy];

    [str6 appendString:@"xxxx"];


    //如果进行了复制          产生的是一个可变的副本,深复制(开辟一个新的空间)

    //如果进行了复制 产生的是一个不可变的副本,浅复制(不会开辟一个新的空间)


    NSLog(@"%@", str6); // itcastxxxx


    Person *p = [Person new];

    //出错: Person类没有遵守NSCopying的协议

    // Person *p1 = [p copy];

  }

  return 0;




——————————————————————————————



    // 堆区

    // str 源对象

    NSString *str = [NSString stringWithFormat:@"abc"];

    //        NSLog(@"str.rc = %lu",str.retainCount);  //1

    //

    //        //str2 新对象

    //        NSString *str2 = [str copy];   //产生一个副本

    //        NSLog(@"str2.rc = %lu",str2.retainCount);  //2

    //        NSLog(@"str.rc = %lu",str.retainCount);  //2


    // 这是一个浅拷贝,不可变的副本

    // 拷贝的地址

    // 源对象的引用计数被+1    新对象指向了源对象

    // NSLog(@"%p,%p",str,str2);


    // 这是一个深拷贝,

    // 源对象的引用计数不变,   新对象引用计数为1

    // 分配一个新的空间

    NSMutableString *newStr = [str mutableCopy];

    NSLog(@"%p,%p", str, newStr);

    NSLog(@"%lu,%lu", str.retainCount, newStr.retainCount);

  }

  return 0;




——————————————————————————————




    单例模式: 保证程序运行期间,某个对象只有唯一的一个实例对象 ,这就是单例模式

   //  这个唯一的实例对象,就叫做 单例对象

  

    实现步骤:

 

    1) 定义一个接入点(工厂方法)

 

    2) 定义一个静态的 单例对象 

 

    3) 判断单例对象是否存在,

  

       如果对象已经存在,就不用创建了

       如果对象不存在了,就创建一次



——————————————————————————————





——————————————————————————————





——————————————————————————————




——————————————————————————————





——————————————————————————————



——————————————————————————————




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值