1、SQLite常用的SQL语句
创建表:create table 表名(字段名 字段数据类型 是否为主键, 字段名 字段数据类型, 字段名 字段数据类型…)
增加:insert into 表名(字段1,字段2…) values(值1,值2…)
insert into table1(field1,field2) values(value1,value2)
删除:delete from 表名 where 字段=值
delete from table1 where 范围
选择:select * from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’
排序:select * from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
2、关于Socket,谈谈TCP/IP 和 UDP的理解
· Socket是一个用于传输网络数据的工具,TCP/IP 和 UDP都是传输协议,用于定义网络数据传输的格式,属于长连接
· TCP/IP 侧重可靠传输,传输速度慢,不会丢失数据,安全,聊天和下载文件时用到
· UDP:侧重快速传输,传输速度快,容易丢失数据包,不安全。局域网游戏和网络游戏,视频聊天的时候用到
· TCP更安全是因为有一个三次握手:第一次握手(客户端发送syn包到服务器,并进入SYN_SEND状态,等待服务器确认),第二次握手(服务器收到syn包,必须确认客户的SYN包,同时自己发送一个SYN+ACK包,此时服务器进入SYN_RECV状态),第三次握手(客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,发送完毕后服务器和客户端都进入ESTABLISHED状态,完成三次握手),三次握手之后才开始正式传输数据。因此使用TCP协议的MSN比采用UDP的QQ传输速度慢,但并不代表不安全,因为程序员可以手动对UDP的数据收发进行验证(比如发送方对每个数据包进行编号然后由接收方进行验证)
· Http:超文本传输协议,用于定义网络数据传输的格式(短链接)http1.0之前不支持短连接,1.1之后默认就是长连接,只要在服务器和客户端同时设置Connection为keep-alive即可
··长连接是为了复用,长连接指的是TCP连接,也就是为了复用TCP连接,也就是说多个HTTP请求可以复用一个TCP连接,节省了很多TCP连接建立和断开的消耗
··比如请求了一个网页,这个网页肯定还包含了CSS、JS等一系列资源,如果是短连接的话,每次打开一个网页,基本要建立几个甚至几十个TCP连接,浪费了大量资源
··长连接不是永久连接,如果一段时间内,具体的时间长短,是可以在header当中进行设置的,也就是所谓的超时时间,这个连接没有HTTP请求发出的话,那么这个长连接就会被断掉
· socket连接是长连接,客户端与服务器保持通道,双方可以主动发送数据,一般多用于即时通讯,游戏,默认超时时间是30秒,默认大小是8k(一个数据包大小)
3、谈一谈内存管理
· iOS的内存管理分为 MRC 和 ARC,管理的是堆区动态产生的对象,基本数据类型就不是内存管理的范围
· 内存管理的核心概念是引用计数器:当对象被alloc、copy、new的时候,引用计数器+1,当被release的时候引用计数器—1,为0的时候就会被系统回收,调用dealloc方法
说道内存管理,就必须说说@property的内存管理参数:
··assign –> 针对于基本数据类型的简单赋值操作
··retain –> release 一次旧对象 retain 一次新对象 (适用于OC对象类型)
··copy –> release 一次旧对象 拷贝一个新对象出来(一般修饰字符串和block)
··weak–> 表示一种非拥有关系,设置该属性时既不释放新值,也不保留旧值,和assign类似,但是目标对象释放时,属性值也会自动清空
··如何避免内存泄露 –> 使用Analyze进行代码的静态分析
· 当然使用block的时候最应该注意下循环引用,使用Leaks检测内存泄露,显示绿色的勾告知内存处理的不错,实际上内存得不到释放。一般我的方法是在控制器声明周期的viewDidAppear和dealloc方法里面打印日志[[self class] description],如果没有打印出来,就说明没有被释放。使用weak typeof(self) weakSelf = self;解决。有一次我是直接使用成员变量,而不是属性,_age,我以为这样没有使用self就可以了,但是后来测试发现还是造成循环引用了,因为_age是控制器的成员变量,也就是强引用了控制器,也要改成弱引用block weak __typeof(_currentModel) weakModel = _currentModel;
4、常见的数据持久化有哪些
偏好设置(preference),利用NSUserDefaults
用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在
NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。如果要存储其他类型,需要先转化为前面的类型,才能用NSUserDefault存储
偏好设置是专门用来保存应用程序的配置信息的,一般不要在偏好设置中保存其他数据
偏好设置会将所有数据保存到同一个文件中。即preference目录下的一个以此应用包名来命名的plist文件。
//1.获得NSUserDefaults文件
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//2.向文件中写入内容
[userDefaults setObject:@"AAA" forKey:@"a"];
[userDefaults setBool:YES forKey:@"sex"];
[userDefaults setInteger:21 forKey:@"age"];
//2.1立即同步
[userDefaults synchronize];
//3.读取文件
NSString *name = [userDefaults objectForKey:@"a"];
BOOL sex = [userDefaults boolForKey:@"sex"];
NSInteger age = [userDefaults integerForKey:@"age"];
NSLog(@"%@, %d, %ld", name, sex, age);
归档(Archiver)、解档(unArchiver),利用NSKeyedArchiver实现归档、利用NSKeyedUnarchiver反接的那个
归档及时将内存中的对象写入到磁盘文件中,归档也叫序列化,解档就是讲磁盘中文件中的对象读取出来
必须遵循NSCoding协议,只要遵循了NSCoding协议的对象都可以通过它实现序列化,两个协议方法必须实现
// 反归档
- (id)initWithCoder:(NSCoder *)aDecoder {
if ([super init]) {
self.avatar = [aDecoder decodeObjectForKey:@"avatar"];
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}
// 归档
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.avatar forKey:@"avatar"];
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
}
归档,把对象归档时需要调用NSKeyedArchiver的工厂方法archiveRootObject: toFile: 方法
NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"person.data"];
Person *person = [[Person alloc] init];
person.avatar = self.avatarView.image;
person.name = self.nameField.text;
person.age = [self.ageField.text integerValue];
[NSKeyedArchiver archiveRootObject:person toFile:file];
反归档
NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"person.data"];
Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:file];
if (person) {
self.avatarView.image = person.avatar;
self.nameField.text = person.name;
self.ageField.text = [NSString stringWithFormat:@"%ld", person.age];
}
属性列表
数据库:SQLite
Core Data
点击查看大神讲解
属性列表
这五种持久化操作不同点
从存储数据大小来看,归档、偏好设置、属性列表三种方法适合存储数据量较小的数据,数据库、CoreData方法适合存储数据量较大的数据
从加密性来看,其中归档会将数据进行加密,而偏好设置是直接保存到属性列表中,不会对数据进行加密
从存储类型来看,属性列表只能存放固定的七种类型(可在plist文件中看到),归档对存储类型无限制