//
// main.m
// 01_FileManager学习
//
// Created by 鲁军 on 2021/4/24.
//
#import
#define LogBOOL(val) NSLog(@"%@", val==YES?@"YES":@"NO")
int main(int argc, const char * argv[]) {
//文件管理员
NSFileManager *manager = [NSFileManager defaultManager];
//删除文件
//BOOL res =[manager removeItemAtPath:@"/Users/lujun/Desktop/aa.txt" error:nil];
// LogBOOL(res);
//重命名 移动过程中换名字
/* BOOL res1 =[manager moveItemAtPath:@"/Users/lujun/Desktop/aa.txt" toPath:@"/Users/lujun/Desktop/xxx.txt" error:nil];
LogBOOL(res1);*/
//移动文件
/* BOOL res2 =[manager moveItemAtPath:@"/Users/lujun/Desktop/aa.txt" toPath:@"/Users/lujun/Desktop/test/aa.txt" error:nil];
LogBOOL(res2);*/
//拷贝文件
/* BOOL res3= [manager copyItemAtPath:@"/Users/lujun/Desktop/aaa.txt" toPath:@"/Users/lujun/Desktop/test/aaa.txt" error:nil];
LogBOOL(res3);*/
//1NO 是 只创建一层,前面文件夹必须存在,否则创建失败
//YES 是一路创建
/* BOOL res4 = [manager createDirectoryAtPath:@"/Users/lujun/Desktop/AA/BB/CC/dd" withIntermediateDirectories:YES attributes:nil error:nil];
if(res4){
NSLog(@"成功!");
}else{
NSLog(@"失败");
}
*/
//创建文件并写入
NSString *str = @"我最爱北京天安门";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@",data);
BOOL res5 = [manager createFileAtPath:@"/Users/lujun/Desktop/hahaa.txt" contents:data attributes:nil];
if(res5==YES){
NSLog(@"成功!");
}else
{
NSLog(@"失败!");
}
return 0;
}
02_FileManager文件终结者案例
//
// main.m
// 02_FileManager文件终结者案例
//
// Created by 鲁军 on 2021/4/24.
//
#import
int main(int argc, const char * argv[]) {
while(1){
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *path= @"/Users/lujun/Desktop/aaa/";
NSArray *arr =[ fileManager contentsOfDirectoryAtPath:path error:nil];
if(arr.count>0){
for(NSString *p in arr){
NSString *newP = [NSString stringWithFormat:@"%@%@",path,p];
if([fileManager isDeletableFileAtPath:newP]){
[fileManager removeItemAtPath:newP error:nil];
}
}
}
[NSThread sleepForTimeInterval:4];
}
return 0;
}
03-NSDate学习
//
// main.m
// 03-NSDate学习
//
// Created by 鲁军 on 2021/4/24.
//
#import
#import "NSDate+itcash.h"
int main(int argc, const char * argv[]) {
/*
NSDate *date = [NSDate new];
NSLog(@"%@",date);
//1 先创建1个日期格式化对象,这个对象可以将1个日期输出为指定的格式
NSDateFormatter *formatter = [NSDateFormatter new];
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
//3 按格式化对象按照指定的格式将日期对象转化
// 转换的时候会自动的转换为当前系统的时区的时间
NSString *str = [formatter stringFromDate:date];
NSLog(@"%@",str);
*/
/* NSDate *date = [NSDate new];
NSDateFormatter *formatter = [NSDateFormatter new];
formatter.dateFormat = @"yy-MM-dd HH:mm:ss";
NSString *str= [formatter stringFromDate:date];
NSLog(@"%@",str);*/
//字符串转对象
/* NSString *strDate = @"2011年12月12号 12时12分13秒";
//先创建一个日期格式化对象
NSDateFormatter * formatter2 = [NSDateFormatter new];
//2 指定字符串日期格式
formatter2.dateFormat = @"yyyy年MM月dd号 MM时mm分ss秒";
//3.转换
NSDate *date1 = [formatter2 dateFromString:strDate];
NSLog(@"%@",date1);
*/
//计算时间
/* NSDate *date2 = [NSDate new];
NSLog(@"%@",date2);
//5000秒以后,在当前 时间的基础上
NSDate *date3 = [NSDate dateWithTimeIntervalSinceNow:8*60*60];//单位是秒
//得到东八区的时间,只需要在原有的基础上增加8个小时,即可。
// NSDate dateWithTimeIntervalSinceNow 取得的是格林威治时间
NSLog(@"%@",date3);
*/
//时间的相减
/* NSString *str1 = @"";
NSDate * startDate = [NSDate date];
for(int i=0;i<20000;i++){
str1 = [NSString stringWithFormat:@"%@%d",str1,i];
}
NSDate * endDate = [NSDate date];
double sj = [endDate timeIntervalSinceDate:startDate];
NSLog(@"经历的时间是:%lf",sj); //0.564000 20000次循环的是时间是 0.794788
*/
//只要年份字符串
/* NSDate *date4 = [NSDate date];
NSDateFormatter *formatter1 = [NSDateFormatter new];
formatter1.dateFormat = @"yyyy";
NSString *str2= [formatter1 stringFromDate:date4];
int year = str2.intValue;
NSLog(@"%d",year); //2021
*/
//利用日历对象拿到年月日字符串
/*NSDate *date5 = [NSDate date];
//先创建一个日历对象 日历对象的作用,可以从日期对象中取到日期对象的各个部分
NSCalendar *calendar = [NSCalendar currentCalendar];
//2.让日历对象从日期对象取出日期的各个部分
NSDateComponents *com =[calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekday fromDate:date5];
NSLog(@"%lu------%lu-------%lu-------%lu",com.year,com.month,com.day,com.weekday);//星期7即是中国人的星期六
*/
//对于分类的使用测试代码
/**
*/
NSDate *date = [[NSDate alloc] init];
NSLog(@"%d",date.year);
//2021-04-24 18:44:49.903851+0800 03-NSDate学习[5164:148167] 2021
return 0;
}
//
// NSDate+itcash.m
// 03-NSDate学习
//
// Created by 鲁军 on 2021/4/24.
//
#import "NSDate+itcash.h"
@implementation NSDate (itcash)
- (int)year{
NSCalendar *calendar = [NSCalendar currentCalendar];
//2.让日历对象从日期对象取出日期的各个部分
NSDateComponents *com =[calendar components:NSCalendarUnitYear fromDate:self];
return (int)com.year;
}
@end
4.copy的使用解释
//
// main.m
// copy的使用解释
//
// Created by 鲁军 on 2021/4/24.
//
/*
1.无论在MRC还是ARC下的 如果属性是NSString的属性的 @property的属性写的是copy
2. copy 复制
1)copy是一个方法 定义在NSObject的类之中的 作用 ,拷贝对象。
NSString ------------>copy --------->
没有产生新对象 ,而是直接将对象的本身的对象地址返回 ,这种拷贝叫做浅拷贝
NSMutableString 有产生的新的对象,这种拷贝叫做深拷贝,拷贝的字符串不可变的对象,深拷贝
2) mutableCopy 定义在NSMutableString
NSString -------------> mutableCopy 可变字符串对象, 深拷贝
NSMutableString -------------> mutableCopy 出来的是一个可变字符串对象 深拷贝
这是字符串的拷贝特点
3
若字符串对象存储在常量区 存储在常量区的数据是不允许回收的
所以存储子啊常量区的字符串的引用计数都是1个超大的数,并且retain 和 release都无效
2) 若字符串存在堆区 这个字符串的对象的和普通的对象是一样的,引用计数器是1
NSString *str = [NSString stringWithFormat:@"jack"];
NSString *str2=[str copy];
NSMutableString *mStr = [NSMutableString]
NSLog(@"%u",str.retainCount); //1
**/
#import
#import "Person.h"
int main(int argc, const char * argv[]) {
Person *p1 = [Person new];
//需求将str赋值给p1.name 属性以后
//再修改str的值 不要影响p1.name
//解决 在setter 方法赋值的时候,将传进来的对象先考钡一份
NSMutableString *str = [NSMutableString stringWithFormat:@"jack"];
p1.name =str;
[str appendString:@"rose"];
NSLog(@"p1.name = %@",p1.name); //jackrose
/*
Person *p1 = [Person new];
NSString *str = @"jack";
p1.name = str;
str = @"rose";
NSLog(@"p1.name = %@",p1.name); // p1.name = jack
*/
/*
NSString *str1= @"jack";
NSString *str2 = [str1 copy];
NSLog(@"%@",str1);
NSLog(@"%@",str2);
NSLog(@"str1 = %p",str1);
NSLog(@"str2 = %p",str2);
NSMutableString *str3 = [NSMutableString stringWithFormat:@"jack"];
NSMutableString *str4 = [str3 copy];
NSLog(@"%@",str3);
NSLog(@"%@",str4);
NSLog(@"str1 = %p",str3); //地址不一致
NSLog(@"str2 = %p",str4); //地址不一致
// [str2 appendString:@"jjj"]; //报错
NSString *str5 = @"jack";
NSMutableString *str6 = [str1 mutableCopy];*/
return 0;
}
//
// Person.h
// copy的使用解释
//
// Created by 鲁军 on 2021/4/24.
//
#import
NS_ASSUME_NONNULL_BEGIN
@interface Person : NSObject
//@property(nonatomic,copy)NSString *name;
{
NSString *_name;
}
-(void)setName:(NSString*)name;
-(NSString *)name;
@end
NS_ASSUME_NONNULL_END
//
// Person.m
// copy的使用解释
//
// Created by 鲁军 on 2021/4/24.
//
#import "Person.h"
@implementation Person
-(void)setName:(NSString*)name{
_name = [name copy];
}
-(NSString *)name{
return _name;
}
@end
05-CGPoint的使用
//
// main.m
// 05-CGPoint的使用
//
// Created by 鲁军 on 2021/4/24.
//
/*
typedef struct {
int x;
int y;
}CZPoint;
CZPoint p = {20,30};
在Foundation框架中已经定义好了。
struct CGPoint {
CGFloat x;
CGFloat y;
}CGPoint;
typedef struct CGPoint CGPoint;
CGFloat 类型的数据实际上就是一个double类型的
这个结构体一般情况下表示坐标的,用来表示在界面上的位置
CGPoint 与NSPoint 都是同一个类型只不过定义两个名字
CGPoint p1;
p1.x = 20;
p1.y = 30;
CGPoint p1 = {20,30};
CGPoint p2 = {.x=20,.y=30};
4 Foundation 框架中快速创建一个
CGPointMake(20,30)
NSPoint p2 = NSMakePoint(20,30);
2.声明1个变量来保存控件的大小
typedef struct {
double width;
double height;
}CZSize;
CZSize size = {50,60};
typedef struct CGSize CGSize
CGSize 声明并初始化的方式
CGSize size;
size.width = 100;
size.height = 30;
2) CGSize size = {100,100};
3) CGSize size = {.width=100,.height=10};
4) CGSize size = CGSizeMake(100,400);
CGSizeMake(widht,height);
b. NSMakeSize(widht,height);
struct CGRect {
}
CGRect
CGRect rect;
rect.origin.x = 20;
rect.origin.y = 40;
rect.size.height = 30;
rect.size.width = 100;
NSRect 和 CGRect是一样的
CGRect的声明和初始化
1)
CGRect rect;
rect.origin.x = 20;
rect.origin.y = 40;
rect.size.height = 30;
rect.size.width = 100;
2)
CGRect rect;
rect.origin= (CGPoint){10,20}; //强转 成CGPoint
rect.size = (CGSize){800,600};
//数组
3) CGRectMake(10,20,30,45);
NSMakeRect(30,40,50,60);
使用的时候 使用 CGSize NSSize Core Graphics
*/
#import
int main(int argc, const char * argv[]) {
CGPoint p1 = CGPointMake(20,30);
NSLog(@"p1.x = %lf . p1.y = %lf",p1.x,p1.y);
NSPoint p2 = NSMakePoint(20,30);
CGSize size1 = CGSizeMake(10,50);
CGSize size = NSMakeSize(100,500);
return 0;
}
06-NSValue使用
//
// main.m
// 06-NSValue使用
//
// Created by 鲁军 on 2021/4/24.
//
#import
int main(int argc, const char * argv[]) {
/* CGSize s1 = CGSizeMake(10,10);
CGSize s2 = CGSizeMake(20,30);
CGSize s3 = CGSizeMake(30,45);
CGSize s4 = CGSizeMake(85,96);
NSValue *v1 = [NSValue valueWithSize:s1];
NSValue *v2 = [NSValue valueWithSize:s2];
NSValue *v3 = [NSValue valueWithSize:s3];
NSValue *v4 = [NSValue valueWithSize:s4];
NSArray *arr = @[v1,v2,v3,v4];
for(NSValue *v in arr){
NSLog(@"%@",NSStringFromSize(v.sizeValue));
}*/
CGPoint p1 = CGPointMake(10,20);
CGPoint p2 = CGPointMake(20,30);
CGPoint p3 = CGPointMake(40,50);
CGPoint p4 = CGPointMake(60,60);
NSValue *v1 = [NSValue valueWithPoint:p1];
NSValue *v2 = [NSValue valueWithPoint:p2];
NSValue *v3 = [NSValue valueWithPoint:p3];
NSValue *v4 = [NSValue valueWithPoint:p4];
NSArray *arr =@[v1,v2,v3,v4];
for(NSValue *v in arr){
NSLog(@"%@",NSStringFromPoint(v.pointValue));
}
return 0;
}
07-自定义类实现拷贝
//
// main.m
// 07-自定义类实现拷贝
//
// Created by 鲁军 on 2021/4/24.
//
/**
1 copy 方法的确 是定义在BNSObject 类中一个方法
copy方法的内部调用了另外1个方法,copyWithZone
这个方法 是定义在NSCoping 协议之中的
因为我们的类没有遵守NSCoping 协议,那么我们的类中就没有copingWithZone 这个方法
所以当我们 自定义 的类调用copy方法的时候就会出错
2如果我们想要让我们自己的恶类具备对象拷贝的能力,那么就让我们的类遵守NSCoping协议
并实现copingWithZone 这个方法
如果想要实现深拷贝,那么重新创建1个对象,并将对象的属性的值复制,返回
如果想要实现浅拷贝。 那么就直接返回self
*/
#import
#import "Person.h"
int main(int argc, const char * argv[]) {
Person *p1 = [Person new];
Person* p2 = [p1 copy];
NSLog(@"%p",p1);
NSLog(@"%p",p2);
return 0;
}
//
// Person.h
// 07-自定义类实现拷贝
//
// Created by 鲁军 on 2021/4/24.
//
#import
NS_ASSUME_NONNULL_BEGIN
@interface Person : NSObject <NSCopying>
@property(nonatomic,assign)int age;
@property(nonatomic,copy)NSString *name;
@end
NS_ASSUME_NONNULL_END
//
// Person.m
// 07-自定义类实现拷贝
//
// Created by 鲁军 on 2021/4/24.
//
#import "Person.h"
@implementation Person
- (id)copyWithZone:(NSZone *)zone{
//1 如果要做深拷贝 你就重新创建1个对象
// 把对象的属性的值复制到新的对象中 将对象返回
Person *p1 = [Person new];
p1.name = _name;
p1.age = _age;
return p1; //地址改变
//上述是深拷贝
// return self; //浅拷贝 地址不变
}
@end
08-单例模式
//
// main.m
// 08-单例模式
//
// Created by 鲁军 on 2021/4/24.
//
/**
什么是单例模式
1. 1个类的对象,无论在何时创建也无论在什么地方创建,也无论创建多少次,创建出来的都是同一个对象
2. 无论如何创建对象,最终 都会调用alloc 方法来创建对象
历史原因,alloc 创建对象最终调用的都是 allocWithZone 方法
我们需要重写 allocWithZone
3.要实现单里模式
重写 +allocWithZone
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
static id instance = nil;
if(instance==nil){
instance = [super allocWithZone:zone];
}
return instance;
}
4. 单里模式规范
必须提供1个类方法,shared类名 开头 都是单里模式
defaule类名。
5 什么时候要把类搞成单里
单例对象可以共享,存储在单例对象中的数据的可以被共享
也就是无论在什么地方创建单利对象 访问的都是同1个对象
*/
#import
#import "Person.h"
int main(int argc, const char * argv[]) {
Person *p1 = [[Person alloc] init];
Person *p2 = [Person new];
Person *p3 = [Person new];
Person *p4 = [Person new];
NSLog(@"%p",p1);
NSLog(@"%p",p2);
NSLog(@"%p",p3);
NSLog(@"%p",p4);
return 0;
}
//
// Person.h
// 08-单例模式
//
// Created by 鲁军 on 2021/4/24.
//
#import
NS_ASSUME_NONNULL_BEGIN
@interface Person : NSObject
@end
NS_ASSUME_NONNULL_END
//
// Person.m
// 08-单例模式
//
// Created by 鲁军 on 2021/4/24.
//
#import "Person.h"
@implementation Person
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
// NSLog(@"哈哈哈哈");
// return nil;
// return [super allocWithZone:zone];
static id instance = nil;
if(instance==nil){
instance = [super allocWithZone:zone];
}
return instance;
}
@end