IOS基础之Foundation框架常用类NSFileManager,DSDate,CGPoint,CGSize,copy,单例

IOS基础之Foundation框架常用类NSFileManager,DSDate,CGPoint,CGSize,copy,单例

1.01_FileManager学习

//
//  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

你可能感兴趣的:(IOS)