在ARC项目中导入MRC的类的时候需要在此类上面添加 -fno-objc-arc
Core Data是苹果自己的数据框架
优点:能管理中大型的数据结构
缺点:不能跨平台 只能在iOS和MacOS平台上使用
Core Data使用步骤
1)创建Core Data模板
2)在Core Data文件内增加实体
实体就是用于存储业务数据的类
3)根据实体生产实体类
1)生成的类都是继承NSManagedObject
继承这个类是为了协助Core Data管理你这个对象
2)生成的类的.m文件内有@dynamic
将来的getter setter不由OC语法本身决定
而由Core Data自己实现
3)生成的类如果不勾选
基本数据类型会被NSNumber包装
注意:如果项目中用到了Core Data,在生成过实体对象之后运行过游戏,之后修改了实体对象,切记再次运行项目时删除模拟器中的应用数据
实体对象 Team(球队) Player(队员) 两者关系 Team——>Player(一对多) Team<——Player(一对一)
Team 实体类中有一个NSSet 集合类型的 myPlayers
Player实体类中有一个Team 类型的 team
以下是单个实体类的增删改查基础操作
// 获取 上下文
AppDelegate * app = [UIApplication sharedApplication].delegate;
// 创建一个查询请求
NSFetchRequest * request = [[NSFetchRequest alloc]initWithEntityName:@"Team"];// Person 是实体对象名
// 执行查询请求 并得到返回结果
NSArray * persons = [app.managedObjectContext executeFetchRequest:requesterror:nil];
// 增
Person * person = [NSEntityDescription insertNewObjectForEntityForName:@"Team"inManagedObjectContext:app.managedObjectContext];
// 删除
NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:@"Team"];
NSArray * teams = [app.managedObjectContext executeFetchRequest:requesterror:Nil];
for (Team * team in persons) {
if ([team.name isEqualToString:@"湖人"]) {
[app.managedObjectContext deleteObject:team];
[app saveContext];
}
}
// 保存
// 更改之后
[app saveContext]; // 保存
两个实体类之间的关系 用TableView表示两者的层级关系
// 添加
NSArray * players = self.team.myPlayers.allObjects;
Player * player = [NSEntityDescriptioninsertNewObjectForEntityForName:@"Player"inManagedObjectContext:self.app.managedObjectContext];
player.name = [alertView textFieldAtIndex:0].text;
player.myTeam = self.team;建立对应关系
[self.appsaveContext];
//删除
NSArray * players = self.team.myPlayers.allObjects;// 获取NSSet集合中的Player类型对象
Player * player = players[indexPath.row];
[self.app.managedObjectContextdeleteObject:player];
[self.appsaveContext];
// 1.设置查询条件
[request setPredicate:[NSPredicatepredicateWithFormat:@"name='李四'"]];
[request setPredicate:[NSPredicatepredicateWithFormat:@"age<=30"]];
// 2.对查询结果排序
[request setSortDescriptors:@[[NSSortDescriptorsortDescriptorWithKey:@"age"ascending:NO]]];
// 数组排序
NSArray * sortTeam = [team sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
Team * t1 = obj1;
Team * t2 = obj2;
if (t1.age > t2.age) {
return NSOrderedAscending;
}else
return NSOrderedDescending;
}];
// 获取plist文件中的内容
NSString * path = [[NSBundle mainBundle] pathForResource:@"Area" ofType:@"plist"];
NSDictionary * rootArea = [NSDictionary dictionaryWithContentsOfFile:path];
// 如果plist文件外围被数组包含,则先打开数组
NSArray * areas = [NSArray arrayWithContentsOfFile:path];
NSDictionary * rootArea = areas[0];
1.User Default
用于存储应用程序的配置信息
1) 是不是第一次打开?
如果是第一次打开 就展示教学图片
2)当前的应用程序版本信息
如果发现本地存储的版本信息 和 服务器上有差距 就 提示用户更新程序
3)当前应用程序被打开的次数
4)数据结构版本信息
做数据迁移(1.0 ->2.0)
User Default 使用 三步走
取值 常用方法有:
返回类型 NSInteger - (NSInteger)integerForKey:(NSString *)defaultName;
返回类型 BOOL - (BOOL)boolForKey:(NSString *)defaultName;
改值 int++ 等等;存值 对应方法:
- (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;
- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
- (BOOL)synchronize; // 同步
2.单例模式
1)设计模式之一
2)使用频率特别高
3)让数据或对象 在程序的各个地方都能访问 并且保持唯一
4)真正限制数量的是对象的个数
-- 使用该类的人不要调用alloc消息 以及任何涉及初始化的类工厂方法
5)保证在程序各处均能访问
+ 静态消息 有类就能调用
创建一个类 LXYSingleton
.h文件
+(LXYSingleton *)sharedSingleton;
.m文件
static LXYSingleton * _sharedInstace;// 声明静态类型,保证内存中一直存在一个该类型对象
+ (LXYSingleton *)sharedSingleton
{
if(_sharedInstace == nil) {
_sharedInstance = [[LXYSingleton alloc] init];
}
return _sharedInstance;
}
在别的类使用 import 导入头文件
LXYSingleton * singleton = [LXYSingleton sharedInstance];
绝对不可以用alloc方法实例化
严禁 release 该对象,否则程序肯定出事
单例模式的优点
属性
在该类声明的属性都可以跨区域访问
单例模式下共享数据
在不同的界面用该属性进行传值 第三种传值方式 类似全局变量(第一种 注入/第二种 delegate)
目的:降低VC之间的耦合程度
还能在不同的任何对象之间传送数据
单例模式的缺点
都有可能修改这个类的属性
给大家推荐一个swift视频教程,后续会不断更新,下载文件需要验证多次,有点耐心哦!