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);