——————————————————————————————
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;
//如果 err为nil 表示读取的过程中没有发生错误
// 不等于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 表示平面的一个点 NSPoint是CGPoint的一个别名
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) 把基本数据类型的变量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
// 2015年06月06日 15时19分00秒
// 日期时间格式化的一个类
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 = @"yyyy年MM月dd日 HH时mm分ss秒";
// 把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) 判断单例对象是否存在,
如果对象已经存在,就不用创建了
如果对象不存在了,就创建一次