基础OC语法
- OC中的内存管理的内容是 堆区的集成自NSObject 的对象
- 对象值为nil时. 引用计数器为0时, 不回收.
- MRC下 set方法的写法
- (void)serCar:(Car *)car{
if(_car != car ){ //----- 1
[_car release]; // -----2
_car = [car retain];
}
}
- 注释 代码1 是为了避免如下情况
Car *byd = [Car new];
[person setCar: byd];
[byd release];
[person setCar: byd];
将bydset两次, 如果不加 if(_car != car) 判断, 因为_car 和car 是同一个对象, 调用 [_car release] 方法时, byd已经被释放了, 调用 _car = [car retain]; 时会出现野指针错误.
- 注释代码2, 是为了避免如下情况
Car *byd = [Car new];
[person setCar: byd]; // ----4
Car *bmw = [Car new];
[person setCar:bmw]; // ---- 5
[byd release];
[bmw release];
[person release];
- 因为set方法内部会将car retain 一次, 如果不加 [_car release]; 在执行代码4时, person的car指针指向byd. 而代码5后, person 的car指针指向bmw, 这就导致 byd 出现内存泄漏
- _weak 指向的对象被释放后, 系统会将 _weak的指针指向nil, 默认的指针就是强指针.
- 在ARC机制先, 对象释放的依据是 对象是否有强指针 指向该对象.
- (void)xxxx{
Car *car= [Car new];
}
// ------- 1
- 在1处 car 被释放了, 原因是局部变量 car释放了, 导致 car指向的 对象 没有了强指针指向, 所以对象被释放.
非正式协议, 本质就是给 Foundation框架中的类增加 category.
沙盒机制
- document: 保存需要持久化的数据 会自动备份
- Library/cache: 保存缓存文件, 不会备份
- Library/ Preference: 保存应用所有的偏好设置. 会自动备份
- temp 保存临时文件
- 把结构体包装成NSValue对象, 可以放到字典和数组里. 如可以吧 CGRect 包装成NSValue 类型 放到数组里.
MyStruct a = {19, 12};
NSValue *v1 = [NSValue value1WithBytes:&a objectType:@encode(MyStruct)]; // 将自定的结构图转成 NSValue
MyStruct b;
[v1 getValue: &b]; // 将Value 转换成自定义的结构体
- copy
对象可变性 | copy | mutableCopy |
---|---|---|
对象不可变 | 不会开辟新地址 | 会开辟新地址 |
对象可变 | 开辟新地址 | 会开辟新地址 |
- 修饰符
- public 任意程序集
- protected 同一类和派生类
- private 同一类中
@interface Car:NSObject{
int _spend; // 使用这个方式声明成员变量 默认使用的是 protected
}
static
- 修饰局部变量, 可以改变局部变量的作用域. 把局部变量作用域变成全局变量
- 修饰全局变量, 可以在本文件中使用.
类对象存储
Dog * d = [Dog new];
[d run];- 先将代码加载到代码区
- 如果是第一使用Dog 类, 则在堆区分配空间, 实例化Dog类对象DogClass, 类对象DogClass 的isa指针指向代码区的Dog类代码. 类对象中还包含 方法的映射表. 即 方法与方法地址的映射.
- 在堆区分配空间实例化Dog类 dInstance, dInstance的isa指针指向类对象.
- 在栈区分配空间, 创建变量d. 变量b的指针指向dInstance 的首地址.
- 调用run方法, 把run 封装层SEL, 在类对象的方法映射表里查找 run对于的方法地址. 如果找到了就调用,如果没找到就报错.
- 如果找到run方法, 就将找到的结果缓存起来, 以提高性能.
刀哥网络
- 1Byte (字节)= 8bit(位)
- 1Char = 1Byte
- 监听 nc-lk port 监听本机 端口请求.
- 从网络上拉去 PList 文件, 从NSData 转成plist 文件 方法
id result = [NSPropertyLIstSeriaLization propertyListWithData:data option: 0 format:NULL error:NULL];
5 加密
* base64 将数据转成二进制文件, 按6位读取数据, 末尾不足补0, 每两个零 , 翻译成 等号, 在ios7.0 以后 增加了base64的支持.
* 散列(哈希)算法, 又叫 数据摘要. 数据指纹, 不能反算. 有名的 md5, SHA1. SHA256, SHA512, 都是这类型的加密,
* md5 特点1. 相同数据加密后得到的结果是一样的, 但是不同的数据, 哪怕是一点点的修改, 在结果上都有巨大的反差.
* HMAC 需要自己设置一个密码. [self.passwordStr hmacMD5StirngWithKey:key]
先把key做一次散列加密,再 和密码一起做一次md5, 在加所一次散列加密, 再做一次md5.
6 extern 表示字符串的具体内容在其他位置设置过值 (通常在.m) 中, 因为const的存在, 所以外部不能修改, 相当于声明了一个不可变得变量供外部使用
.h
extern NSString *const UserloginNotif;
.m
NSString * const UserloginNotif = @"UserloginNotif";
7 json 是什么?
json 是特殊格式的字符串.
8 能被NSJSONSerialization
是一个转换 JSON 和 Foundation对象的类. 能被序列化的要求:
* 顶级节点 必须是一个NSArray, 或者 NSDictionary
* 所以的对象必须是NSString, NSNumber, NSArray, NSDictionary, NSNull.
* 所以字典的key都必须是 NSString
* NSNumber 不能为空, 或者去穷大
9 如何判断一个对象能否被而序列化?
可以使用方法[NSJSONserialization isValidJSONObject: obj]
判断是否可以序列化
10 HTTP HEAD
方法. head方法用于向服务器请求头部信息, 不请求数据信息. 可以用在下载大文件时, 先向服务器请求头部信息, 获取文件总大小, 再请求文件数据, 就可以实现,现在进度显示.
11 断点续传
1. 断点续传不能用缓存
2. 断点续传告诉服务器从哪里开始传
NSString *range = [NSString stringWithFormat:@"bytes=%lld-", localFileSize];
[request setValue:range forHTTPHeaderField:@"Range"];
3. 断点续传的状态码是206
12 静态库: 每个程序都有一个副本. 动态库, 内存中只有一个副本, 多个程序共用一个库.
13 request. Header 中字段以及解释
* User-Agent 告诉服务器客户端的类型
* Content-Type 传递数据的类型
* Range 断点续传时使用
* Authorization 身份验证
14 NSURLSessionConfig 字段介绍
* HTTPAdditionalHeader 一个session的全局头字段, 对于很多的请求都需要的头数据,可以使用这个字段统一设置
* allowsCellularAccess 允许蜂窝访问
* HTTPMaximumConnectionsPerHost 对于一个host的最大并发连接数, 默认是4
15 在给NSURLSession 设置代理的时候, Session会对代理有强引用, 为了避免循环引用, 在视图消失, 或者不不需要网络请求的时候, 使用 [_Session invalidateAndCancel]; _Session = nil;
一旦被调用, Session就不能用了