不可变字符串
【OC字符串的初始化】
1.字符串的初始化(减方法)
NSString * str2 = [[NSString alloc]init];
2.字符串的初始化(加方法)
NSString * str3 = [NSString string];
3.字符串的初始化由另外一个字符串给
NSString * str4 = [[NSString alloc]initWithString:str1];
4.将C语言的字符串给OC字符串作为初始化的值(减方法)
NSString * str6 = [[NSString alloc]initWithUTF8String:“cccc”];
5.将C语言的字符串给OC字符串作为初始化的值(加方法)
NSString * str7 = [NSString stringWithUTF8String:“ccccc”];
6.自定义格式的OC字符串初始化(减方法)
NSString * str8 = [[NSString alloc]initWithFormat:@”%d %c %@”,2,‘A’,@”ohhhh~” ];
7.自定义格式的OC字符串初始化(加方法)
NSString * str9 = [NSString stringWithFormat:@”%d %c %@”,2,‘B’,@”shabi~~”];
【将OC字符串转成其他类型】
1. 把字符串转成int类型
int i = [str intValue];
2 .把字符串转成float类型
float f = [str floatValue];
3.把字符串转成long long类型
long long l = [str longLongValue];
4。把字符串转成OC的NSUInteger类型
NSUInteger n = [str integerValue];
5.把字符串转成double类型
double d = [str doubleValue];
6。把字符串转成BOOL类型
BOOL b = [str boolValue];
7.把字符串转成c语言的字符串
const char * p = [str UTF8String];
【字符串的比较】
1.比较字符是不是相同
BOOL ret = [str1 isEqualToString:str2];
2.比较两个字符串的大小
NSComparisonResult ret1 = [str1 compare:str2];
返回值:
NSOrderedSame : 相等
NSOrderedDescending :降序(左边大于右边)
NSOrderedAscending:升序 (右边大于左边)
3.得到字符串的长度
NSUInteger len = [str1 length];
4.得到OC字符串的第几个字符
unichar c = [str1 characterAtIndex:0];
遍历:
for ( int i = 0 ; i < len; i ++) {
c = [str1 characterAtIndex:i];
NSLog(@”%c”,c);
}
【子串】
1.在父串中查找子串的范围
NSRange rang = [str rangeOfString:subStr];
/*
typedef struct _NSRange {
NSUInteger location; //索引
NSUInteger length; //长度
} NSRange;
*/
2.提取子串(从索引直到串尾)
NSString * sub1 = [str substringFromIndex:3];
3.提取子串(从开头到索引 不包括索引)
NSString * sub2 = [str substringToIndex:3];
4.提取某段范围的子串
sub3 = [str substringWithRange:NSMakeRange(1, 4)];
【大小写转换】
1.小写全部转成大写
NSString * st2 = [st1 uppercaseString];
2。大写全部转小写
NSString * st3 = [st1 lowercaseString];
【可变字符串】
【初始化】
1.开辟空间的初始化(减方法)
NSMutableString * str1 = [[NSMutableString alloc]initWithCapacity:10];
2.开辟空间的初始化(加方法)
str1 = [NSMutableString stringWithCapacity:10];
3.带格式字符串的初始化
NSMutableString * str2 = [[NSMutableString alloc]initWithFormat:@”%@”,@”abc”];
【可变字符串的增删改查】没有返回值
1.追加
[str2 appendString:@”123″];
2.有格式的追加
[str2 appendFormat:@”%d%@”,2,@”asd”];
3.删除字符串中某个范围字符
[str2 deleteCharactersInRange:NSMakeRange(0, 2)];
4.插入
[str2 insertString:@”AAA” atIndex:3];
5。修改
[str2 replaceCharactersInRange:NSMakeRange(3, 4) withString:@”MaoGe”];
6.重置
[str2 setString:@”abcd”];
//3种置空方法 删除 重置 替换
[str2 deleteCharactersInRange:NSMakeRange(0, [str2 length])];
[str2 setString:@””];
[str2 replaceCharactersInRange:NSMakeRange(0, [str2 length]) withString:@””];
不可变数组
【初始化】
1.不可变数组的初始化 (减方法)
NSArray * arr1 = [[NSArray alloc]init];
2.不可变数组的初始化 (加方法)
arr1 = [NSArray array];
3.不可变数组带参数(对象)的初始化 (减方法)
NSArray * arr2 = [[NSArray alloc]initWithObjects:@”123″,@”abc”,nil];
4.不可变数组带参数的初始化 (加方法)
arr2 = [NSArray arrayWithObjects:@”123″,@”www”,@”abc”,nil];
5. 把其他数组当作参数的初始化 (减方法)
NSArray * arr3 = [[NSArray alloc]initWithArray:arr1];
6.把其他数组当作参数的初始化 (加方法)
arr3 = [NSArray arrayWithArray:arr1];
7.数组最常用的初始化 —- 直接赋值
NSArray * arr4 = @[@”one”,@”two”,@”three”];
8.获取数组元素(对象)的个数
NSUInteger count = [arr4 count];
9.从路径获取数组
NSArray * arr = [NSArray alloc]initWithContentsOfFile:path];
【数组 — 字符串】
1.字符串按格式切割成数组
NSString * str = @”one two three”;
NSArray * arr5 = [str componentsSeparatedByString:@” “];
2.数组按格式拼接成字符串(不可变字符串)
NSString * str1 = [arr5 componentsJoinedByString:@”*”];
【数组遍历】
1.普通遍历 最常规的方法
for (int i = 0; i < [arr5 count]; i ++) {
NSLog(@”%@”,arr5[i]);
}
2.快速遍历 首先要明确元素的类型
for (NSString * str in arr5) {
NSLog(@”%@”,str);
}
3.枚举器遍历
//把数组的元素放到枚举器里边
//原因:有一个方法可以遍历自己枚举器里面的元素
NSEnumerator * enumer = [arr5 objectEnumerator];
id obj;
while (obj = [enumer nextObject]) {
NSLog(@”%@”,obj);
}
4.枚举器逆序变量
NSEnumerator * enumer1 = [arr5 reverseObjectEnumerator];
id obj1;
while (obj1 = [enumer1 nextObject]) {
NSLog(@”%@”,obj1);
}
5.最装逼的遍历
[arr5 enumerateObjectsUsingBlock:^(id obj,NSUInteger idx,BOOL *stop){
//obj 元素
//idx 索引
//*stop 是否停止
NSLog(@”%@ %ld”,obj,idx);
}];
【获取数组的元素】
1.获取数组的第一个元素
NSString * str =[array firstObject];
2.获取数组最后一个元素
NSString * str1 = [array lastObject];
3.获取指定索引的元素
NSString * str2 = [array objectAtIndex:1];
4.通过元素获得该元素的索引
NSUInteger index = [array indexOfObject:@”1″];
5.根据元素在指定范围内找其索引
index = [array indexOfObject:@”2″ inRange:NSMakeRange(0, 2)];
6.判断该数组有没有该元素
BOOL ret = [array containsObject:@”2″];
可变数组
【初始化】
1.给一个大小的初始化
NSMutableArray * arr = [[NSMutableArray alloc]initWithCapacity:10];
【增加】
1.添加一个元素
[arr addObject:@”one”];
2.添加多个元素
[arr addObjectsFromArray:array];
【插入】
1.插入元素到指定索引 其他元素自动后退
[arr insertObject:@”two” atIndex:0];
2.插入多个元素到指定范围
[arr insertObjects:array atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 3)]];
【替换】
1.替换指定索引的元素
[arr replaceObjectAtIndex:1 withObject:@”three”];
【删除】
1.删除指定元素
[arr removeObject:@”one”];
2.删除最后一个元素
[arr removeLastObject];
3.删除指定范围内指定的元素
[arr removeObject:@”1″ inRange:NSMakeRange(0, 10)];
4.删除索引上的元素
[arr removeObjectAtIndex:0];
5.删除所有的元素
[arr removeAllObjects];
【重置】
[arr setArray:array];
【判断数组是否相等】
[arr isEqualToArray:array];
【交换元素位置】
[countArray exchangeObjectAtIndex:j withObjectAtIndex:j + 1];
不可变字典
【初始化】
1. value — key
NSDictionary * dict =[[NSDictionary alloc]initWithObjectsAndKeys:@”one”,@”1″,@”two”,@”2″, nil];
2.批量设置键值对 value — key
NSArray * arr1 = @[@”1″,@”2″];
NSArray * arr2 = @[@”one”,@”two”];
NSDictionary * dict1 = [[NSDictionary alloc]initWithObjects:arr1 forKeys:arr2];
3. key : value
NSDictionary * dict3 = @{@”1″:@”one”,@”2″:@”two”,@”3″:@”one”};
4.通过key拿到value
NSString * str1 = [dict3 objectForKey:@”1″];
5.拿到所有的key
NSArray * arr3 = [dict3 allKeys];
6.拿到所有的Value
arr3 = [dict3 allValues];
7.拿到所有相同value的key (key一定唯一存在 value不唯一)
arr3 = [dict3 allKeysForObject:@”one”];
【遍历】
1.普通遍历
for (int i = 0; i < [arr3 count]; i ++) {
NSLog(@”%@”,[dict3 objectForKey:arr3[i]]);
}
2.快速遍历
for (NSString * str in dict3) {
//str 是key
NSLog(@”%@”,dict3[str]);
}
【可变字典】
【初始化】
1.带参数的初始化
NSMutableDictionary * mDict = [NSMutableDictionary dictionaryWithDictionary:dict3];
2.设置键值对 value ———— key
[mDict setValue:@“one” forKey:@“1”];
3.删除键值对
[mDict removeObjectForKey:@”one”];
4.删除所有键值对
[mDict removeAllObjects];
5.根据key值 批量删除键值对
[mDict removeObjectsForKeys:arr3];
6.重置
[mDict setDictionary:dict3];
【继承】
1.子类可以继承父类公开和受保护的成员变量、属性、方法
【注】 如果父类的属性没有声明为受保护的 是不能继承的(此时的属性是私有的)
【注】没有声明(.h)的方法不能继承
2.重写
继承来父类的方法 子类可以用 但是不能满足子类
1⃣️ 完全重写
2⃣️部分重写 [super 父类的方法] 之后是子类独有的部分
例如:
-(instancetype)init{
// self = [super init];//先初始化父类
if (self = [super init]) {
//初始化子类独有的部分
_a = 1;
_b = 2;
_age = 10;
}
return self;
}
//不完全重写
-(void)jump{
[super jump];//通过super调用父类的方法
NSLog(@”可以大小跳“);//实现子类派生部分
[self run];
}
3.作用
1⃣️很多对象有很多共同属性 创建一个父类 由这些对象继承
2⃣️继承官方的类或者第三方类 符合自己当前的工程
【注】类簇(工厂类)不能继承 (例如 NSString 等)
3⃣️通过继承统一多态的接口 (父类指针可以指向子类)
-(void)beatAnimal:(Animal *)ani;
【多态】
1. 重写 重载 虚函数(统一接口)
2.同一个接口(同一个方法) 不同的实现 (重写、重载)
3.同一个动作(方法)对不同的事物,会有不同的反应(虚函数)
//-(void)beatAnimal:(Dog *)dog;
//-(void)beatAnimal1:(Cat *)cat;
//-(void)beatAnimal2:(Lion *)lion;
-(void)beatAnimal:(Animal *)ani;
【类别】Catogary
(主要用于第三方类的引用方法、重新定义这个方法、添加方法)
//给源类(系统类)打补丁,可以分门别类地管理这个类
主要用于第三方类 有时候第三方类的方法不能满足 这个时候我们就要用类别扩写方法引用
例如 NSString有些方法不能满足我们
【注】
1.引入头文件
2.类别不可以添加成员变量,但是可以添加属性和成员方法
3. 方法的名字尽量不要和源类相同
例如:
#import “NSString+Show.h”
@implementation NSString (Show)
//在类别里声明实现的方法,相当于在源类里增加了这个方法
-(void)show1{
NSLog(@”这是一个字符串!“);
}
-(void)show2{
NSLog(@”这真的是一个字符串!“);
}
-(NSUInteger)length{
return 10;
}
– (BOOL)hasPrefix:(NSString *)aString{
return YES;
}
@end
【匿名类别】
//可以添加属性( 根据这些属性 )添加新的方法
两种存在形式
1.单独文件
Person_Show.h 一个文件没有.m文件 去”Person.m”实现
#import “Person.h”
@interface Person ()//匿名类别
{
int _a;
}
@property int b;
-(void)show;
@end
2.写在“Person.m”里面
#import “Person.h”
//()内没有类别的名字,这种叫匿名类别
@interface Person ()
{
//匿名类别可以声明成员变量
int _aa;
int _bb;
}
-(void)show444;//方法的私有化(没有绝对的私有方法)
@end
@implementation Person
{
int _a;
int _b;
}
-(void)show444
{
}
-(void)show{
_a = 10;
// [self show1];
NSLog(@”sss”);
}
-(void)show1{
_b = 11;
[self show];
}
@end
1.声明Dog这个类 可以根据Dog类建立dog对象 也可以根据cl建立dog类
Class cl = [Dog class];//类方法 编译时确定
Dog * dog = [[Dog alloc]init]; //编译时确定
Dog * dog1 = [[cl alloc]init];
2.根据字符串建立Class变量 运行时 灵活性
Class cl3 = NSClassFromString(@”Dog”); //运行时确定
3.根据cl3建立一个对象 可以用id接
id obj3 = [[cl3 alloc]init];
4.判断这个对象是不是属于这个类
BOOL ret = [obj isKindOfClass:[Dog class]];
5.选择器函数 装函数的类型 参数只能是对象
SEL sel1 = @selector(show); //不带参
SEL sel1 = @selector(show:); //带一个参
SEL sel1 = @selector(show: show:);//最多带两个参
6.判断这个obj这个对象有没有SEL选择器携带的方法 有没有响应
BOOL ret2 = [obj respondsToSelector:sel1];
7.对象调用选择器方法
[obj performSelector:sel1];//无参方法的调用
[obj performSelector:sel1 withObject:dog]; //一个参数的调用
[obj performSelector:sel1 withObject:dog withObject:dog];//两个参数的调用
8.经常调用选择器方法会发生警告 消除警告的宏
#pragma clang diagnostic push
#pragma clang diagnostic ignored “-Warc-performSelector-leaks”
//中间为obj调用SEL选择器代码
#pragma clang diagnostic tests
9.根据字符串建立SEL选择器变量
SEL sel2 = NSSelectorFromString(@”show:”);
【创建单例对象】
1、文件单例 — 操控文件
NSFileManager * ma = [NSFileManager defaultManager];
2.报错对象
__autoreleasing NSError * error;
【查看】
1.查看文件 — 深度遍历 (所有子文件(目录))
NSArray * arr = [ma subpathsOfDirectoryAtPath:PATH error:&error];
2.查看文件 — 浅度遍历 (本层文件(目录))
NSArray * arr2 = [ma contentsOfDirectoryAtPath:PATH error:&error];
3.查看文件的属性
NSDictionary * dict = [ma attributesOfItemAtPath:PATH error:&error];
4.查看文件是否存在
BOOL ret = [ma fileExistsAtPath:PATH];
5.查看文件是文件还是文件夹(目录) ret1 为YES 文件夹 ret1 为NO 文件
BOOL ret1;
[ma fileExistsAtPath:PATH isDirectory:&ret1];
【创建】
1.拼接路径
NSString * str = [PATH stringByAppendingPathComponent:@”目录1/目录“];
2.根据字符串拼接路径
NSString * str = [PATH stringByAppendingString:@”/目录1/mul”];
3.自定义拼接路径
NSString * str = [PATH stringByAppendingFormat:@“/%@/mul”,path];
4.创建路径
BOOL ret2 = [ma createDirectoryAtPath:str withIntermediateDirectories:YES attributes:nil error:&error];
//第一个参数:路径 第二个参数:是否创建中间目录,如果YES会替我们创建中间目录
//第三个参数:属性 第四个参数:报错信息
5.创建文件
1⃣️拼接文件路径
NSString * str = [PATH stringByAppendingPathComponent:@”文件.txt”];
2⃣️定义文件内容 (字符串)
NSString * str1 = @”🐭🐅🐭🐅🐭🐅🐭🐅🐭🐅🐭🐅🐭🐅🐭🐅🐭🐅🐭🐅“;
3⃣️将字符串(内容)写入数据流
NSData * data = [str1 dataUsingEncoding:NSUTF8StringEncoding];
4⃣️创建文件 同时将(数据流)写入文件
BOOL ret = [ma createFileAtPath:str contents:data attributes:nil];
//第一个参数:路径 第二个参数:数据流 第三个参数:属性
【移动】
1.文件(目录)移动 原路径 — 目的路径
BOOL ret = [ma moveItemAtPath:path1 toPath:path2 error:&error];
//第一个参数:源目录路径 第二个参数:目的目录路径
【拷贝】
1.文件(目录)拷贝 原路径 — 目的路径
BOOL ret = [ma copyItemAtPath:path1 toPath:path2 error:nil];
【删除】
BOOL ret = [ma removeItemAtPath:path error:nil];
【创建句柄】 通过操作句柄来操作文件
【初始化】
1.读出哪个文件
NSFileHandle * han1 = [NSFileHandle fileHandleForReadingAtPath:@”/Users/wangchuncheng/Desktop/OCDay9/文件.txt”];
2.写入哪个文件
NSFileHandle * han2 = [NSFileHandle fileHandleForWritingAtPath:@”/Users/wangchuncheng/Desktop/OCDay9/文件.txt”];
【句柄定位】
1.定位到文件尾部
[han1 seekToEndOfFile];
2.定义到某个字节
[han1 seekToFileOffset:20];
3.得到当前句柄的定位
unsigned long long l = han1.offsetInFile;
【读出数据流data】
han1定义为读出
1.读到文件尾部
NSData * data = [han1 readDataToEndOfFile];
2.读到某个字节
NSData * data3 = [han1 readDataOfLength:4];
3.把data 转成 str
NSString * str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
4.把 str 转成 data
NSData * data = NSData * data2 = [@”abcd” dataUsingEncoding:NSUTF8StringEncoding];
【把数据流写入】
han2定义为写入
1.将数据流全部写入
[han2 writeData:data2];
2.定位
[han2 seekToFileOffset:2];
【注意】
1⃣️索引超过文件字节 之后的写入不执行
2⃣️索引没超过文件字节 写入的字节多大就会覆盖多大 之后接着写
3⃣️想要接着内容继续写 就把句柄定位到文件尾部
【归档】
数据的持久化
1⃣️可变数据流(已备归档要将数据写进去data)
NSMutableData * data1 = [NSMutableData data];
2⃣️初始化归档对象 (将归档内容写入哪个数据流)
NSKeyedArchiver * arc = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data1];
3⃣️arc归档 对象 —— 关键字
[arc encodeObject:dog forKey:@”班级“];
4⃣️封口
[arc finishEncoding];
🈚️把数据写进文件 data —— file
[data1 writeToFile:@”/Users/wangchuncheng/Desktop/OCDay9/班级.super” atomically:YES];
【解归档】
1⃣️把文件内容读出到数据流 data
NSData * data2 = [NSData dataWithContentsOfFile:@”/Users/wangchuncheng/Desktop/OCDay9/班级.super”];
2⃣️初始化解归档对象 (从哪里data 读出)
NSKeyedUnarchiver * uarc = [[NSKeyedUnarchiver alloc]initForReadingWithData:data2];
3⃣️解归档对象 根据关键字解码对象
cl = [uarc decodeObjectForKey:@”班级%d”];
4⃣️封口
[uarc finishDecoding];
【子对象如何遵守coding协议】
1.头文件加<NSCoding>
#import <Foundation/Foundation.h>
@interface Student : NSObject<NSCoding>
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) int score;
@property (nonatomic,copy) NSString *sex;
@end
#import “Student.h”
2. 实现文件分别实现归档和解归档方法
@implementation Student
-(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:@”名字“];
[aCoder encodeObject:self.sex forKey:@”性别“];
[aCoder encodeInt:self.score forKey:@”分数“];
}
-(id)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@”名字“];
self.sex = [aDecoder decodeObjectForKey:@”性别“];
self.score = [aDecoder decodeIntForKey:@”分数“];
}
return self;
}
@end
1.创建模型类存储数据
#import <Foundation/Foundation.h>
@interface BookModel : NSObject
@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *auther;
@property (nonatomic,copy) NSString *price;
@property (nonatomic,copy) NSString *summary;
@end
2.创建管理类 ①初始化可变数组/字典存储模型对象 ②解析Json创建模型对象 ③管理模型
1⃣️初始化可变数组/字典存储模型
{
NSMutableArray *_arr;
}
-(instancetype)init{
if (self = [super init]) {
_arr = [[NSMutableArray alloc]init];
}
return self;
}
2⃣️解析Json创建模型
-(void)praseJson{
//路径
NSString * path = @”http://onepiece.local/SH/json/Bookjson”;
//转成网址对象
NSURL *url = [NSURL URLWithString:path];
//从网址读内容
NSData *data = [NSData dataWithContentsOfURL:url];
//解析
NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSArray *array = dict[@”root”][@”books”][@”book”];
for (NSDictionary * dic in array) {
//创建模型对象 存储数据
BookModel * book = [[BookModel alloc]init];
book.name = dic[@”name”];
book.price = dic[@”price”];
book.summary = dic[@”summary”];
book.auther = dic[@”auther”][@”name”];
[_arr addObject:book];
}
}
3.只给main函数一个测试接口
//打印
-(void)print{
for (BookModel * mo in _arr) {
NSLog(@”%@ %@ %@ %@”,mo.name,mo.auther,mo.price,mo.summary);
}
}
+(void)test{
MyJson * json = [[MyJson alloc]init];
[json praseJson];
[json print];
}
【协议】
1.规范接口
2.实现对象之间的交互
3.可以模拟多继承(遵守多个协议)
注:协议里面的方法
1⃣️必须遵守:默认或 @required 修饰
2⃣️可选方法:@optional 修饰
【代理模式】
1.代理传值 (正向传值) 代理做事
人 ——> 狗/猫/狮子 去看门
(主动方) (被动方)
代理
(拟定协议) (遵守协议)
1 : n
2.代理回调
页面 下载类
n : 1
(遵守协议) (拟定协议)
(被动方) (主动方)
代理
1⃣️ 传网址 —————> 接收网址
2⃣️ 下载类解析网址存储数据
3⃣️ 接收数据 <————— 返回数据
(其实是代理通过协议的方法自己取回数据)
【代理传值】(正向传值)
1.主动方拟订协议
@protocol MyProtocol1 <NSObject>
-(void)print;
@end
2.主动方设置代理对象
@property (nonatomic,weak) id<CompareProtocol>delegate;
3.被动方(代理)遵守协议
@interface Cat : NSObject<CompareProtocol>
4.被动方(代理)实现协议方法
-(void)print;
【代理的回调】
1.主动方拟定协议 ( 一般是下载类)
@protocol DownloadMess <NSObject>
-(void)getMess:(NSString *)mess;//返回数据
@end
2.主动方下载类设置遵守协议对象的属性
@property (nonatomic,weak) id<DownloadMess>delegate;
3.主动方解析数据的方法包含代理回调数据的方法
-(void)dowanload:(NSString *)path;
注: 👆里面包含着代理遵守协议取回数据的方法
-(void)getMess:(NSString *)mess;
4.被动方遵守协议
@interface Controller1 : NSObject<DownloadMess>
5.被动方拿回数据
1⃣️创建主动方(下载类)对象
Download * down = [[Download alloc]init];
2⃣️将下载类对象的代理设置为自己
down.delegate = self;
3⃣️调用主动方(下载类)解析数据的方法
[down dowanload:@”www.baidu.com”];
Block:是管理程序中代码块的对象
1.block的声明和实现
int(^block1)(int,int) = ^(int a,int b){
return a + b;
};
2.block的执行部分:
int sum = block1(1,2);
【注】block的调用 Block的声明的和实现都不执行代码,只有调用才会执行
3.系统中的block (数组的遍历)
NSArray * arr = @[@”one”,@”two”];
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
//obj是元素
//idx是索引
//*stop是是否停止循环
if ([obj isEqualToString:@”one”]) {
*stop = YES;
}
NSLog(@”%@ %ld”,obj,idx);
//至少会循环一次
}];
【block的重要运用】
block回调 (比代理的回调简单方便)
【方式1】
界面类 下载类
1.声明和实现block1 1.通过设置成员方法接收block1(调用block1)
(想要从下载类获得什么数据 2.block1(arr) 返回数据
block1的参数就设定什么)
2.通过下载类方法向下载类传送block1
举例:
1⃣️界面类:#import “Controller.h”
-(void)downloadMess{
//定义block
void(^block)(NSMutableArray *) = ^(NSMutableArray *arr){
NSLog(@”下载完了/…..”);
//存储下载后的数据
_arr = arr;
};
//初始化下载类 让下载对象去下载数据
Download * obj = [[Download alloc]init];
//下载对象调用下载数据的方法
[obj parseData:@”www.baidu.com” withBlock:block];
}
2⃣️下载类 #import “Download.h”
-(void)parseData:(NSString *)path withBlock:(void (^)(NSMutableArray *))block1{
。。。。下载解析过程
//把数据返还给界面类
//block传回数据
block1(arr);
}
【方式2】
界面类 下载类
1.设置block1 1.通过设置属性(block属性)接收block1
2.通过设置下载类block属性传送block12.self.block(arr)传回数据
1⃣️界面类 #import “Controller.h”
-(void)downloadMess{
//定义block
void(^block1)(NSMutableArray *) = ^(NSMutableArray *arr){
_arr = arr;
};
//让下载类去下载数据
Download * obj = [[Download alloc]init];
//设置下载类的block属性
obj.block = block1;
//下载类对象调用下载数据的方法
[obj parseData:@”www.baidu.com”];
}
2⃣️下载类 #import “Download.h”
//block属性
@property (nonatomic,copy) void(^block)(NSMutableArray *);
//成员方法
-(void)parseData:(NSString *)path{
。。。。下载解析过程
self.block(_arr);
}
NSValue 把基本类型 、基本类型的复合对象(C数组等)、对象(OC数组、OC字符串等)存储起来
1.把复合类型转化成对象
int a[5] = {1,2,3,4,5};
NSValue * value1 = [NSValue valueWithBytes:&a objCType:@encode(int[5])];
【注】
@encode
1.是OC支持的类型的字符串
2.知道数据类的大小
NSLog(@”%s”,@encode(int[10]));//[10i]
NSLog(@”%s”,@encode(int));//i
NSLog(@”%s”,@encode(char));//c
2.提取Value里面的内容
1⃣️必须知道value1存储的类型
int b[5];
2⃣️ 从value1中提取出来的内容存在b数组内
[value1 getValue:&b];
3.NSValue存储OC字符串对象
NSValue * value2 = [NSValue valueWithNonretainedObject:@”字符串“];
4.从NSValue中提取字符串对象
NSString * str = [value2 nonretainedObjectValue];
5.存储OC数组对象
NSArray * arr = @[value1,@”1″];
value2 = [NSValue valueWithNonretainedObject:arr];
6.从NSValue中提取OC数组
NSArray * arr1 = [value2 nonretainedObjectValue];
7.判断两个NSValue对象是否相同
BOOL ret = [value1 isEqualToValue:value2];
1.把int类型转成对象 (减方法)
NSNumber * num1 = [NSNumber numberWithInt:a];
2.把int类型转成对象 (加方法)
num1 = [[NSNumber alloc]initWithInt:a];
3.把基本类型转成NSNumber (方式三)
num1 = @2;
num1 = @4.5;
num1 = @YES;
num1 = @‘s’;
4.把NSNumber转成基本类型
int b = num1.intValue;
5.比较两个NSNumber对象
NSComparisonResult ret = [@2 compare:@3];
if (ret == 0) {
NSLog(@”相等“);
}else if (ret == 1){
NSLog(@”左边大于右边“);
}else if (ret == –1){
NSLog(@”右边大于左边“);
}
6.比较两个NSNumber类型的对象是否相等
if ([@2 isEqualToNumber:@2] == YES) {
NSLog(@”相等“);
}
【注】NSNumber 继承于 NSValue 所以也可以用👇这种方式
if ([@2 isEqualToValue:@2]) {
NSLog(@”相等“);
}
【NSDate】
1.创建一个时间点对象
NSDate * date = [NSDate date];
NSLog(@”%@”,date); //2015-08-09 03:56:21 +0000
//格林尼治时间 本初子午线时间 0°经线 我们在东八区 120°E
2.当前时间过了多少 精确到秒 8*60*60 表示8个小时
date = [NSDate dateWithTimeIntervalSinceNow:8*60*60];
NSLog(@”~~%@”,date); //2015-08-09 11:56:21 +0000
3.返回以1970/01/01 GMT为基准,然后过了secs秒的时间
date = [NSDate dateWithTimeIntervalSince1970:3600];
NSLog(@”%@”,date);//1970-01-01 01:00:00 +0000
4.返回以2001/01/01 GMT为基准,然后过了secs秒的时间
date = [NSDate dateWithTimeIntervalSinceReferenceDate:3600];
NSLog(@”%@”,date);//2001-01-01 01:00:00 +0000
5.以当前时间(Now)为基准时间,返回实例保存的时间与当前时间(Now)的时间间隔
NSTimeInterval num = [date timeIntervalSinceNow];
NSLog(@”%f”,num);//-0.005570
6.返回很多年以后的未来的某一天。 比如你需要⼀一个比现在(Now)晚(大)很长时间的时间值,则可以调用该方法。
date = [NSDate distantFuture];
NSLog(@”%@”,date); //4001-01-01 00:00:00 +0000
7.返回很多年以前的某一天。比如你需要⼀一个比现在(Now)早(小)大很长时间的时间值,则可以调用该方 法。
date = [NSDate distantPast];
NSLog(@”%@”,date); //0001-12-30 00:00:00 +0000
【NSZone】
1.创建你所在的当前时区对象
NSTimeZone * zone1 = [NSTimeZone systemTimeZone];
NSLog(@”%@”,zone1);//Asia/Chongqing (GMT+8) offset 28800
2.返回TimeZone支持时区的键值对
NSDictionary * dic = [NSTimeZone abbreviationDictionary]
【NSDateFormatter】
1.创建时间戳对象
NSDateFormatter * matt = [[NSDateFormatter alloc]init];
2.按照格式输出时间(自动变成当前系统时间)
matt.dateFormat = @”yyyy年MM月dd日 HH:mm:ss.S”;
NSLog(@”%@”,[matt stringFromDate:date]);//2015年08月05日 15:10:09.1
【注】年:yyyy
月:MM
日:dd
小时:HH
分钟:mm
秒:ss
毫秒:S