Objective-C基础api

1.OC数组不可以存储基本数据类型 NSArray: 有序、可以重复、静态数组

   // 1. 数组创建
        NSArray* array= [NSArray arrayWithObjects:@"110",@"120", nil];
                      NSLog(@"--%@",array);
        
        NSLog(@"count==%lu",[array count]);
        //2.数组遍历
        for(int i=0;i<[array count];i++){
          NSLog(@"count==%@",  [array objectAtIndex:i]);
        }
        
        //3.  是否包含某一个元素
        BOOL bool1= [array containsObject:@"110"];
        NSLog(@"bool--%i",bool1);
        
        //4. 快速创建数组
         NSArray *arr= @[@155,@100,@30];
       NSArray* newArr=  [arr sortedArrayUsingSelector:@selector(compare:)];
        NSLog(@"newArr--%@",newArr);
        
        Person* p1=[Person new];
        p1.age=100;
        Person* p2=[Person new];
        p2.age=400;
        Person* p3 =[Person new];
        p2.age=200;
        NSArray* pArr=@[p1,p2,p3];
        //5.  自定义排序
        NSArray* pArrNew= [pArr sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(Person*  _Nonnull obj1, Person*   _Nonnull obj2) {
            return  obj1.age - obj2.age;
        }];
        
        //6.  字符串切割
        NSString* str=@"xiao_ze_ming";
        NSArray* strArr= [str componentsSeparatedByString:@"_"];
        NSLog(@"strArr=%@",strArr);
    
        // 7. 把数组写入文件中
        // 如果把一个数组写入文件中,本质写入一个XML文件
        // IOS开发中一般情况下我们会将xml 扩展名保存到plist
      //  BOOL flag1= [arr writeToFile:@"/Users/denganzhi/abc.plist" atomically:true];
     //  NSLog(@"flag1=%i",flag1);
        // 从文件读取数据
        NSArray* newArray1=[NSArray arrayWithContentsOfFile:@"/Users/denganzhi/abc.plist"];
        NSLog(@"newArray1=%@",newArray1);

2.  动态数组 NSMutableArray:

 // 1. 创建动态数组
    NSMutableArray* arrM=[NSMutableArray arrayWithObject:@"xiaoming1"];
    // 2. 添加
    [arrM addObject:@"xiaohei2"];
    //3.  把指定静态数组的元素去取出来放入  NSMutableArray 中
    [arrM addObjectsFromArray:@[@"lj1",@"xiaozhi"]];
   // 4. 插入
    [arrM insertObject:@"xcp" atIndex:1];
    // 5. 删除
    [arrM removeObject:@"xiaoming1"];   //删除指定元素
    [arrM removeObjectAtIndex:0];  // 删除指定角标准
    [arrM removeLastObject];   // 删除最后一个元素
    //6. 替换
    [arrM replaceObjectAtIndex:1 withObject:@"M"];
    // 7. 获取
    for(int i=0;i< arrM.count;i++){
        NSLog(@"-%d--%@",i,[arrM objectAtIndex:i]);
    }
    NSLog(@"---%@",arrM);

3.   NSDictionary 字典使用: 

// 字典创建方式1:
    NSDictionary* dict1= [NSDictionary dictionaryWithObject:@"xiaoming" forKey:@"username" ];
    NSLog(@"username=%@",[dict1  objectForKey:@"username"]);
    
    // 字典创建方式2:
    NSDictionary* dict2= [NSDictionary dictionaryWithObjects:@[@"xiaoming",@"50"] forKeys:@[@"username",@"age"]];
    
    // 字典的简单创建:
    NSDictionary *dict3 = @{@"name":@"lnj", @"age":@"30", @"height":@"1.75"};
     NSLog(@"%@ %@ %@", dict3[@"name"], dict3[@"age"], dict3[@"height"]);

    
    // 字典变量
    NSArray* keys= [dict3 allKeys];
    for(int i=0;i<dict3.count;i++){
        NSString* key= keys[i];
        NSString* value= dict3[key];
        NSLog(@"key=%@,value=%@",key,value);
    }
    
    // 迭代器
    [dict3 enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        NSLog(@"key=%@--value:%@",key,obj);
    }];
    
    
    // xml 扩展 plist, NSDictroty 字典和 文件对应
    [dict3 writeToFile:@"/Users/denganzhi/abc.plist" atomically:YES];
    NSDictionary* newDict=[NSDictionary dictionaryWithContentsOfFile:@"/Users/denganzhi/abc.plist"];
    NSLog(@"newDict=%@",newDict);
    

 4.   NSMutableDictionary 字典使用:

 // 1.可变字典
    // 字典创建
    NSMutableDictionary* dictM=[NSMutableDictionary dictionary];
    // 2.添加
    [dictM setObject:@"lnj" forKey: @"username"];
    // 添加传入参数是字典
    [dictM setValuesForKeysWithDictionary: @{@"age":@"30",@"name":@"xiaoming"}];
    // 3. 删除
    [dictM removeObjectForKey:@"age"];
    // 4.  获取
    NSLog(@"username=%@",dictM[@"username"]);
    
    // 5. 修改
    // setObject 存在那么添加
    // setObject 不存在那么修改

    [dictM setObject:@"ddahei" forKeyedSubscript:@"name"];
    
     NSLog(@"---%@",dictM);
    
  

  // 可变字典和不可变字典对比
    // 如果是不可变字典出现同名key, 那么后面的key对一个的值不会被保存
    //如果是可变字典出现同名key, 后面的会覆盖前面的

5. 常用结构体

   // 常用结构体,保存坐标、尺寸、坐标和尺寸
   //  CGPoint 和 NSPoint 一样的 取了一个别名
    NSPoint point= NSMakePoint(100, 200);
    
    NSSize size= NSMakeSize(200, 200);
 
    NSRect rect= NSMakeRect(0, 0, 100, 100);

6.  NSNumber NSValue 包装类

  //NSNumber  包装基本数据类型
    int age=100;
    // 1. 将基本数据类型  转化为对象类型,对象类型才可以存储NSArray
    NSNumber* ageNumber= [NSNumber numberWithInt:age];
    int age1= [ageNumber intValue];
    
    NSLog(@"age1=%d",age1);
     //2. 简写,如果是变量必须,@()
    NSNumber* temp=@(age);
    // 基本数据类型写法
    NSNumber* temp1= @40;
    
    
    // NSValue 包装结构体
    
   // 1. 如果是OC结构体: 使用系统提供的  valueWithxxx
     CGPoint point = NSMakePoint(10, 20);
    NSValue *value = [NSValue valueWithPoint:point];
    NSLog(@"value=%@",value);
   // 2.  NSValue 包装自定义结构体
    struct Person{
        int age;
        char* name;
    };
    struct Person p={100,"小明"};
    // 第一个是指针,第二个是结构体类型
    // 把结构体 放入 NSValue中包装
    NSValue *pValue = [NSValue valueWithBytes:&p objCType: @encode(struct Person)];
    // 保存成 NSValue 才可以存入 NSArray中
    NSArray* arr= @[pValue];
     struct Person res;
    
    // 从pvalue 中 取出自定义 结构体
    [pValue  getValue:&res];
     NSLog(@"%s", res.name);

  7.  NSDate 、 NSCalendar

  //NSDate: 时间
    //NSDate ---> NString, 输出当前时间
     NSDate* now=[NSDate new];
    //  在now基础上 增加一个天 86400
     NSDate* mingtiang= [now dateByAddingTimeInterval:86400]; // 在now
     NSDateFormatter* nsformater= [NSDateFormatter new];
     nsformater.dateFormat=@"yyyy-MM-dd HH:mm:ss";
     NSString* str= [nsformater stringFromDate:now];
     NSString* str1= [nsformater stringFromDate:mingtiang];
     NSLog(@"now时间是:%@",str);
     NSLog(@"mingting时间是:%@",str1);
    // NString —> NSDate
     NSDate* date1= [nsformater dateFromString:str];

    
  // NSCalendar  日历类
    NSCalendar* calender1= [NSCalendar currentCalendar];
    // 使用l日历类 从 NSDate中获取时间
    NSCalendarUnit type =NSCalendarUnitYear |
    NSCalendarUnitMonth |
    NSCalendarUnitDay |
    NSCalendarUnitHour  |
    NSCalendarUnitMinute |
    NSCalendarUnitSecond;
NSDateComponents * cmps= [calender1 components:type
                                      fromDate:now];
    NSLog(@"year==%ld,month=%ld,day=%ld", cmps.year,cmps.month,
          cmps.day);
    
    // 比较2个时间的差值
    NSDate* now2= [NSDate new];
    NSDate* mingtiang2= [now dateByAddingTimeInterval:86400]; // 在now
    NSDateComponents* cmps23 = [calender1 components:type fromDate:now2 toDate:mingtiang2 options:0];
    
    NSLog(@"差距是,year==%ld,month=%ld,day=%ld,h=%ld,min=%ld,ss=%ld", cmps23.year,cmps23.month,cmps23.day,cmps23.hour,cmps23.minute,cmps23.second);

 8.  NSFileManager   文件夹api 使用

  NSFileManager* manager= [NSFileManager defaultManager];
    // 1. 判断文件是否存在
    BOOL flag=  [manager fileExistsAtPath:@"/Users/denganzhi/abc.plist"];
    NSLog(@"flag=%i",flag);
    // 2. 判断一个文件是否存在并且是否是一个文件夹
    // 如果存在flag2=1  如果是目录dir=1
    BOOL dir=NO;
    BOOL flag2= [manager fileExistsAtPath:@"/Users/denganzhi/abc.plist" isDirectory:dir];
    NSLog(@"flag2=%i,dir=%i",flag2,dir);
    //3. 获取文件或者文件夹属性
    NSDictionary* info= [manager attributesOfItemAtPath:@"/Users/denganzhi/abc.plist" error:nil];
    // 文件属性放回在字典中
   // NSLog(@"info=%@",info);
    
    // 4.  获取文件夹下所有文件
    // 只能获取当前文件夹下所有文件名称
      //不能 获取子孙文件
  NSArray* res = [manager contentsOfDirectoryAtPath:@"/Users/denganzhi/" error:nil];
  //   NSLog(@"res=%@",res);
   
    // 5. 可以获取  子孙文件
 //   NSArray *res1= [manager subpathsAtPath:@"/Users/denganzhi/githubinfo/"];
    NSArray* res1= [manager subpathsOfDirectoryAtPath:@"/Users/denganzhi/githubinfo/" error:nil];
 NSLog(@"res=%@",res1);
    
    // 6.  创建文件夹,只能创建 文件夹
    // 路径, 上传文件不存在,是否自动创建
    // 属性
    // 错误类型
    [manager createDirectoryAtPath:@"/Users/denganzhi/create" withIntermediateDirectories:YES attributes:nil error:nil];
 
   // 7. 文件创建 ,写入 str7
    NSString* str7=@"小置同学";
    NSData* data7= [str7 dataUsingEncoding:NSUTF8StringEncoding];
    [manager createFileAtPath:@"/Users/denganzhi/create.txt" contents:data7 attributes:nil];

 9.    浅拷贝 和深拷贝  oc中  

深拷贝: 内存拷贝
 NSMutableString* mstr=[NSMutableString stringWithFormat:@"身拷贝"];
 NSString* mstrcopy= [mstr copy];
 深拷贝产生了新的对象,mstr 和 mstrcopy 指针不同

A浅拷贝: 拷贝出来的和原来的都指向同一块内存
    NSString* str=@"浅拷贝";
    NSString* copystr =[str copy];
    NSLog(@"str=%p,copystr=%p",str,copystr);
   str 和  copystr 都是 指向 同一个字符串,指针相同,除了这种类型,其他的都是深复制
 

10.  单例设置模式: 

Tools.h:

//
//  Tools.h
//  其他api
//
//  Created by 邓安置 on 2020/5/10.
//  Copyright © 2020 邓安置. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Tools : NSObject<NSCopying,NSMutableCopying>

// 一般情况下创建一个 单例对象都有一个与之对应的类方法

// 一般情况下用于创建单例对象的方法名都以 share或者 default开发

+(instancetype)shareInstance;

@end

NS_ASSUME_NONNULL_END

Tools.m:

//
//  Tools.m
//  其他api
//
//  Created by 邓安置 on 2020/5/10.
//  Copyright © 2020 邓安置. All rights reserved.
//

#import "Tools.h"

@implementation Tools



+(instancetype)shareInstance{
    
    Tools* instance=[[self alloc] init];
    
    return instance;
    
}
static Tools* _instance = nil ;
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    
    // 单线程版本
    // 调用alloc的时候回调用 该方法
    // 在该方法中控制当前对象只创建一次即可
//    if(_instance == nil){
//        // 申请内存
//        _instance= [[super allocWithZone:zone]  init];
//    }
    
    // 多线程版本
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance= [[ super allocWithZone:zone] init];
    });
    
    return _instance;
}

/**
  所有的oc 对象  都实现 NSCopying,NSMutableCopying  协议,保证可以进行深拷贝
    重新分配内存
 */
- (id)copyWithZone:(NSZone *)zone{
//    Tools* t = [[[self class] allocWithZone:zone] init];
//    return t;
    return  _instance;
}

-(id)mutableCopyWithZone:(NSZone *)zone{
     return  _instance;
}

@end

  main中  使用: 

 // 单例设计模式
    Tools* t1=[Tools shareInstance];
    Tools* t2=[Tools shareInstance];
    // t1 和  t2 地址 相同
    NSLog(@"单例:%p,%p",t1,t2);

猜你喜欢

转载自blog.csdn.net/dreams_deng/article/details/105983296
今日推荐