本篇主要是总结:1.自己在过去一年以来的学习经验以及不足;
2.接下来应该怎么去学习,学习那些方面
所取得的成绩
1.基本属性的运用。
strong,weak,copy,assign,nonatomic,atomic,copy
等属性修饰的作用有了一个比较明确用法。一般默认的是strong
,也就是强引用,而为了避免循环引用时,用weak
,修饰string
时,用copy
,以得到新的内存分配,而不只是原来的引用。所有的属性,都尽可能使用nonatomic,以提高效率,除非真的有必要考虑线程安全。有关copy,retain,assign
,retain是指针拷贝,copy是内容拷贝,使用assign
: 对基础数据类型 (NSInteger)和C数据类型(int, float, double, char
,等)。在拷贝之前,都会释放旧的对象。,可以参考OC中assign、copy 、retain等关键字的含义.
2.OC中页面的传值
OC中传值我现在熟悉的有1.属性传值;2.代理传值 3.通知传值 4.block传值 5.全局变量 可以参考这篇浅谈iOS常用的几种传值方式
3.数据的存储方式 转自:iOS 数据存储的常用方式
1.xml属性列表(plist)归档
只能存储基本数据类型(NSString、NSDictionary、NSArray、NSData、NSNumber
)
NSString *docPath =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)[0];
// 拼接要保存的地方的路径
NSString *filePath = [docPathstringByAppendingPathComponent:@"str.plist"];
// 1、写入数据
[array writeToFile:filePath atomically:YES];
// 2、 读取数据
NSArray *array = [NSArray arrayWithContentsOfFile:filePath];
2.偏好设置
UserDefaults设置数据时,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘应用程序就终止了。出现以上问题,可以通过调用synchornize方法强制写入
用法:
NSUserDefaults *UserDefaults = [NSUserDefaultsstandardUserDefaults];
// 1、写入
[UserDefaults setBool:NO forKey:@"isLogined"];
// 强制写入
[defaults synchornize];
// 2、读取
BOOL isVisble = [UserDefaults boolForKey:@"isLogined"];
其实,它存储的就是一个字典
3.归档与反归档
基本使用:需要归档的模型类必须要遵守NSCoding
协议,然后模型实现类中必须实现两个方法
:1>encodeWithCoder ->归档
;2> initWithCoder: - > 解档
使用注意
如果父类也遵守了NSCoding协议,请注意:
应该在encodeWithCoder:方法中加上一句
[super encodeWithCode:encode]; // 确保继承的实例变量也能被编码,即也能被归档
应该在initWithCoder:方法中加上一句
self = [super initWithCoder:decoder]; // 确保继承的实例变量也能被解码,即也能被恢复
示例
// 1. 自定义模型类Person
// 1.1 Person.h文件
#import <Foundation/Foundation.h>
// 只要一个自定义对象想要归档,必须要遵守NSCoding协议,并且要实现协议的方法
@interface Person : NSObject<NSCoding>
@property (nonatomic, assign) int age;
@property (nonatomic, strong) NSString *name;
@end
// 1.2 .m实现文件
#import "Person.h"
#define KName @"name"
#define KAge @"age"
@implementation Person
// 什么时候调用:当一个对象要归档的时候就会调用这个方法归档
// 作用:告诉苹果当前对象中哪些属性需要归档
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_name forKey:KName];
[aCoder encodeInt:_age forKey:KAge];
}
// 什么时候调用:当一个对象要解档的时候就会调用这个方法解档
// 作用:告诉苹果当前对象中哪些属性需要解档
// initWithCoder什么时候调用:只要解析一个文件的时候就会调用
- (id)initWithCoder:(NSCoder *)aDecoder
{
#warning [super initWithCoder]
if (self = [super init]) {
// 解档
// 注意一定要记得给成员属性赋值
_name = [aDecoder decodeObjectForKey:KName];
_age = [aDecoder decodeIntForKey:KAge];
}
return self;
}
@end
// 2. 实例 -》基本使用:取 / 存 数据
// 归档
[NSKeyedArchiver archiveRootObject: self.persons toFile:KFilePath];// 将self.persons模型对象数组
// 解档
_persons = [NSKeyedUnarchiver unarchiveObjectWithFile:KFilePath];