代码块Block:Block就是一个函数体,也可以叫做匿名函数,它是OC对于闭包的实现,在块状中我们可以持有或引用局部变量,同时利用Block你可以将一个操作作为一个参数进行传递。
关于Block的总结如下:
1.Block类型的定义: 返回值类型(^变量名)(参数列表);(Block其实也是一种类型)
2.Block的typedef定义: 返回值类型(^变量名)(参数列表);
3.Block的实现: ^(参数列表){操作主体};
4.Block中可以读取快外面的变量,但是不能修改,如果要修改那么这个变量必须声明__block修饰;
当我们不改变原有代码,为一个类扩展其他功能时,我们考虑继承这个类进行实现,但是这样一来使用时就必须定义成新视线的子类才能拥有扩展的新功能。分类category可以在不改变原有类的情况下扩展新功能,又可以在使用时不定义新类型。
KVC:键值编码
由于OC语言的特性,你根本不必进行任何操作就可以进行属性的动态读写,这种方式就是Key Value Coding
常用的KVC操作方法如下:
动态设置:setValue:属性值 forKey:属性名(用于简单路径)
setValue:属性值 forKeyPath:属性路径(用于符合路径,例如Person中有一个Account类型的属性,那么Person.Account就是一个复合属性)
动态读取:valueForKey:属性名、valueForKeyPath:属性名
KVO:键值监听
在ObjC中使用KVO操作常用的方法如下:
注册指定Key路径的监听器: addObserver: forKeyPath: options: context:
删除指定Key路径的监听器: removeObserver: forKeyPath、removeObserver: forKeyPath: context:
回调监听: observeValueForKeyPath: ofObject: change: context:
KVO的使用步骤也比较简单:
通过addObserver: forKeyPath: options: context:为被监听对象(它通常是数据模型)注册监听器
重写监听器的observeValueForKeyPath: ofObject: change: context:方法
OC之Foundation框架:
我们通常说的Cocoa框架,事实上是一个框架的集合,它保罗了众多子框架,其中最终的要数“Foundation”和”UIKit”。前者是框架的基础,和界面无关,其中包含了大量常用的API;后者是基础UI类库。
Foundation框架一般分为下列几大类:
1.值对象
2.集合
3.操作系统服务:文件系统,URL,进程通讯
4.通知
5.归档和序列化
6.表达式和条件判断
7.OC语言服务
NSRange,NSPoint,NSSize,NSRect都是常用的结构体,其实就是对应的CGRange,CGPoint等等等…
-(void)RangeTest
{
//NSRange,第一个参数是起始位置,第二个参数是长度
//几种定义方式
//1.直接定义
NSRange rg1={1,3};
//2.
NSRange rg2;
rg2.location=1;
rg2.length=3;
//3.使用NSMakeRange方法进行定义
NSRange rg3=NSMakeRange(1, 3);
//打印的时候注意不能直接打印,需要转换成NSString对应的方法进行转换一下,因为Range不是对象,是结构体,%@是指针对象
NSLog(@”%@”,NSStringFromRange(rg1));
}
日期操作
//日期操作相关
-(void)DateTest
{
//获取当前时间
NSDate *nowDate=[NSDate date];
//在当前时间上加上XXX秒,在OC中多数时间单位都是秒
NSDate *date1=[NSDate dateWithTimeIntervalSinceNow:100];
//随机获取一个时间
NSDate *date2=[NSDate distantFuture];
//获取过去的一个时间
NSDate *date3=[NSDate distantPast];
//得到两个时间的差,返回的是秒
NSTimeInterval time=[date2 timeIntervalSinceDate:date1];
//返回两个时间中较早的时间
NSDate *date4=[date1 earlierDate:date2];
//日期格式化
NSDateFormatter *formatter=[[NSDateFormatter alloc] init];
formatter.dateFormat=@”yy–MM–dd HH:mm:ss”;
NSString *timeNow=[formatter stringFromDate:date1];
//字符串转化成日期
NSDate *strDate=[formatter dateFromString:@”xxxxx”];
}
字符串的相关操作:
OC中字符串类的操作很方便,如:
字符串的初始化:
初始化有如下几种方法:
1.[[NSString alloc] init]
2.[[NSString alloc] initWithString:@”aaaa”]
3.[[nsstring alloc] initWithFormat:@”age is %i”,19]
大小写转化:
转换成大写:
[@”hello world” uppercaseString]
转换成小写:
[@”HELLO WORLD” lowercaseString]
首字母大写:
[@”hello world” capitalizedString]
后缀前缀判断:
[@”abcdef” hasPrefix:@”ab”]
[@”abcdef” hasSuffix:@”ef”]
字符串比较:
BOOL result= [@”abc” isEqualToString:@”aBc”];
NSLog(@”%i”,result);
//结果:0
NSComparisonResult result2= [@”abc” compare:@”aBc”];//如果是[@”abc” caseInsensitiveCompare:@”aBc”]则忽略大小写比较
if(result2==NSOrderedAscending){
NSLog(@”left<right.”);
}else if(result2==NSOrderedDescending){
NSLog(@”left>right.”);
}else if(result2==NSOrderedSame){
NSLog(@”left=right.”);
}
//结果:left>right.
字符串截取:
NSLog(@”%@”,[@”abcdef” substringFromIndex:3]);//从第三个索引开始(包括第三个索引对应的字符)截取到最后一位
//结果:def
NSLog(@”%@”,[@”abcdef” substringToIndex:3]);////从0开始截取到第三个索引(不包括第三个索引对应的字符)
//结果:abc
字符串转换:
NSLog(@”%i”,[@”12″ intValue]);//类型转换
//结果:12
NSLog(@”%zi”,[@”hello world,世界你好!” length]);//字符串长度注意不是字节数
//结果:17
NSLog(@”%c”,[@”abc” characterAtIndex:0]);//取出制定位置的字符
//结果:a
const char *s=[@”abc” UTF8String];//转换为C语言字符串
路径操作
void test3(){
NSMutableArray *marray=[NSMutableArray array];//可变数组
[marray addObject:@”Users”];
[marray addObject:@”KenshinCui”];
[marray addObject:@”Desktop”];
NSString *path=[NSString pathWithComponents:marray];
NSLog(@”%@”,path);//字符串拼接成路径
//结果:Users/KenshinCui/Desktop
NSLog(@”%@”,[path pathComponents]);//路径分割成数组
/*结果:
(
Users,
KenshinCui,
Desktop
)
*/
NSLog(@”%i”,[path isAbsolutePath]);//是否绝对路径(其实就是看字符串是否以“/”开头)
//结果:0
NSLog(@”%@”,[path lastPathComponent]);//取得最后一个目录
//结果:Desktop
NSLog(@”%@”,[path stringByDeletingLastPathComponent]);//删除最后一个目录,注意path本身是常量不会被修改,只是返回一个新字符串
//结果:Users/KenshinCui
NSLog(@”%@”,[path stringByAppendingPathComponent:@”Documents”]);//路径拼接
//结果:Users/KenshinCui/Desktop/Documents
}
//扩展名操作
void test4(){
NSString *path=@”Users/KenshinCui/Desktop/test.txt”;
NSLog(@”%@”,[path pathExtension]);//取得扩展名,注意ObjC中扩展名不包括”.”
//结果:txt
NSLog(@”%@”,[path stringByDeletingPathExtension]);//删除扩展名,注意包含”.”
//结果:Users/KenshinCui/Desktop/test
NSLog(@”%@”,[@”Users/KenshinCui/Desktop/test” stringByAppendingPathExtension:@”mp3″]);//添加扩展名
//结果:Users/KenshinCui/Desktop/test.mp3
}
OC之归档:
归档:在其他语言中又叫“序列化”,就是将对象保存到硬盘
解档:在其他语言中又叫“反序列化”就是将硬盘文件还原成对象
其实归档就是数据存储的过程,在IOS中数据的存储有五种方式:
1.xml属性列表(plist归档)
2.NSUserDefaults(偏好设置)
3.NSKeyedArchiver(加密形式)
4.SQLite3(嵌入式数据库)
5.Core Dara(面向对象方式的嵌入式数据库)
1.XML属性列表
操作起来比较简单,但是缺点就是:
1.是明文保存的
2.操作的对象是有限的,只有NSArray,NSMutableArray,NSDictionary,NSMutableDictionary
归档的时候只要调用对应的WriteToFile方法即可,解档调用arrayWithContentsOfFile或者DictionaryWithContentsOfFile。但是注意想NSString,NSNumber,NSData即使有这个方法它存储的也不是XML格式
3.NSKeyedArchiver
自定义的对象如何归档,如果要对自定义对象进行归档,那么这个对象必须实现NSCoding协议,在这个协议中有两个方法都必须实现:
-(void)encodeWithCoder:(NSCoder *)aCoder;通过给定的Archiver对消息接收者进行编码;
-(id)initWithCoder:(NSCoder *)aDecoder;从一个给定的Unarchiver的数据返回一个初始化对象;
/**
* 当一个对象要归档进沙盒中时,就会调用这个方法
* 目的:在这个方法中说明这个对象的哪些属性要存进沙盒
*/
– (void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:self.sex forKey:@”sex”];
[encoder encodeObject:self.phone forKey:@”phone”];
[encoder encodeObject:self.username forKey:@”username”];
[encoder encodeObject:self.token forKey:@”token”];
[encoder encodeObject:self.name forKey:@”name”];
[encoder encodeObject:self.img forKey:@”img”];
[encoder encodeObject:self.userid forKey:@”userid”];
}
/**
* 当从沙盒中解档一个对象时(从沙盒中加载一个对象时),就会调用这个方法
* 目的:在这个方法中说明沙盒中的属性该怎么解析(需要取出哪些属性)
*/
– (id)initWithCoder:(NSCoder *)decoder
{
if (self = [super init]) {
self.sex = [decoder decodeObjectForKey:@”sex”];
self.phone = [decoder decodeObjectForKey:@”phone”];
self.username = [decoder decodeObjectForKey:@”username”];
self.token = [decoder decodeObjectForKey:@”token”];
self.name = [decoder decodeObjectForKey:@”name”];
self.img = [decoder decodeObjectForKey:@”img”];
self.userid = [decoder decodeObjectForKey:@”userid”];
}
return self;
}
//保存账户
+(void)saveAccount:(JBAccount *)account
{
[NSKeyedArchiver archiveRootObject:account toFile:JBAccountPath];
}
//返回账户
+(JBAccount *)account
{
// 加载模型
JBAccount *account = [NSKeyedUnarchiver unarchiveObjectWithFile:JBAccountPath];
return account;
}
//销毁账户
+(void)logoutAccount
{
NSFileManager *fileManeger=[NSFileManager defaultManager];
if ([fileManeger isDeletableFileAtPath:JBAccountPath]) {
[fileManeger removeItemAtPath:JBAccountPath error:nil];
[MBProgressHUD showSuccess:@”注销成功”];
}
}