(id)数据类型:1、对象不需要*号
2、可以发送任何存在的消息
3、不能用.属性
4、可以指向任何类的对象,而不关心其具体的类型
KVC和KVO
kVC 键值编码 通过把属性名当成key 来改变属性的值
KVO 键值观察者 通过KVC的方式 把属性当做key 来观察属性值的变化 做出响应 需移除观察者
单例 (一个类的对象只能被使用一次)
通过方法 让对象只创建一次 可以避免重复创建 节省内存开支
使用环境:不需要重复创建的操作类中 封装数据库 网络请求 某个固定的对象 不希望在使用的时候 被创建成其他的对象(当前用户)
单例的生命周期(从程序开始到程序结束)
写一个单例
//单例
static User *user = nil;
@implementation User
+(id)defaultManager{
@synchronized (self) {
if (user == nil) {
user = [[User alloc]init];
}
}
return user;
}
+(instancetype)allocWithZone:(struct _NSZone *)zone{
if (user == nil) {
user = [[User alloc]init];
}
return user;
}
static HTTP_Manager_Delegate *manager=nil;
//在多线程中的一个只能有一次的标识符
static dispatch_once_t onceToken;
//多线程中 查看是否有一个带有onceToken标识的对象
dispatch_once(&onceToken, ^{
//如果没有 创建
manager = [[HTTP_Manager_Delegate alloc]init];
});
//如果有 就return
return manager;
@class
仅仅是声明一个类名,并不会包含类的完整声明
能解决循环包含的问题:当两个类文件有循环依赖关系 ( A 引用 B , B 引用 A ) 时,需要用 @class
import 和 #include
import 是 Objective-C 导入头文件的关键字,完整地包含某个文件的内容
会自动导入一次,不会重复导入;
不会引发交叉编译;
include
C/C++ 导入头文件的关键字,完整地包含某个文件的内容
会引发交叉编译, 因为在 Objective-C 中会存在C/C++和Objective-C 混编的问题,如果用 #include 引入头文件,会导致交叉编译
import<> 和 import""
<> : 引用系统文件,它用于对系统自带的头文件的引用,编译器会在系统文件目录下去查找该文件.
"": 用户自定义的文件用双引号引用,编译器首先会在用户目录下查找,然后到安装目录中查
网络请求:首先需要一个接口,还需要request(设置缓存方式,请求时间),需要连接服务器,请求数据,解析;
AFN
全称是AFNetworking,是对NSURLConnection的一层封装
它运行效率没有ASI高,但是使用比ASI简单
它 实现推送,要一个接口,封装参数(字典)、manager 设置请求格式 ,还可以post/get请求
get/post区别
get:url与参数封装到一起,有长度限制,安全系数低
post:url与参数分开,长度不受限,安全系数高
block作用:
1、保存代码。一段代码在合适的时间执行(请求成功时弹出一个提示框)。
2、block一般用来两个的类的数据逆传递(修改昵称的时候)
3、block也可以将一个操作当做参数来传递
做回调函数,可替代代理;
注:如果要在代码块里修改外部的局部变量的时候,要用__block或者__weak修饰,不然会崩溃。
循环引用:
strong weak
delegate 可以用assign、weak
用weak,避免野指针(一个对象释放了,但内存没有释放掉)
UITableView的重用机制?.
tableView 出现界面卡死,或者上下滑动出现卡顿现象的原因?
1、没有使用重用机制;
2、滑动cell时,有耗时操作,阻塞主线程(只能用来更新UI)
多线程:用来处理耗时操作,增加用户体验
多线程包括?
NSThread:开辟线程,需要手动管理
NSOperation:需要有线程队列,可以添加依赖关系,(如果不放在线程中,它不一定在子线程中)
GCD:NSOperation是基于GCD的封装
1》为多核的并行运算提出了解决方案
2》GCD会利用更多的CPU内核,比如双核,四核
3》GCD自动管理线程的生命周期(创建线程,调度任务,销毁线程)
4》程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码
- 1、创建视图
- 2、创建一个串行队列
- 3、用异步方式执行串行队列中的任务
- 4、加载网络资源
- 5、回到主线程
- 6、更新UI
执行队列的四种方式:
串行同步
串行异步
并行同步
并行异步
数据持久化
常用的数据持久化方式有: 属性列表(plist文件)、归档(存储自定义的类的对象时;存储用户的数据(昵称,uid))、偏好设置(NSUserDefault(存储一些简单的数据(用户的设置)))、sqlite3、core data、FMDB(大量数据的时候) create table student IF NOT EXISTS (id
integer, name text, age text)
当有少量基础数据类型的数据和NSArray、NSDictionary需要储存并且无需加密时,就以使用plist文件
储存少量的数据,而且需要加密,比如登陆密码、获取的accessToken时,或者需要储存对象,比如做收藏夹、最近访问,都可以使用键值归档
偏好设置的话就是储存一些用户设置信息,比如程序中设置当中的一些开关的Bool值等
当需要储存大量的数据时,比如需要离线缓存一些数据,就需要使用数据库了,sqlit3是c语言的东西,使用起来不是特别方便,而FMDB是oc对其的封装使用起来比较方便,所以一般开发当中都是使用FMDB
VFL(可视化格式语言)有几个标示符?
VFL:Visual Format Language 可视化格式语言
H:水平方向
V: 垂直方向
| 表示父视图
- 本身表示一段距离
-距离- 就表示指定距离
视图本身的宽度
[字符串表示的视图] 表示自动布局当前视图 参照视图
[字符串表示的视图(视图的宽高 或者 最小最大的宽高或者相对宽高)]; 注意:()不要丢掉
H:|-50-[view1(>=100)]-50-|
V:|-100-[view1(30)]
使用自动布局的步骤:
1.使用自动布局 autulayout frame 就会失效 ——>不需要再去设置视图的frame
使用代码自动布局的时候 需要禁用 translatesAutoresizingMaskIntoConstraints =NO
2.绑定视图与字符串
3.添加约束
中国语言
横向:距离父视图左侧100 视图本身的宽度最小是100 距离父视图右侧是100
竖向:距离父视图顶部150 视图本身的高度是40
可视化语言
H:|-100-[view(>=100)]-100-|
V:|-150-[view(40)]
推送流程:
1、首先要有APPID;
2、根据 APP ID 创建推送证书(根据需要创建不同环境下的推送证书)
3、再向推送平台提供推送证书
4、向苹果服务器发送设备信息 接收苹果服务器发送回来的deviceToken
5、向推送服务器发送deviceToken
6、再推送服务器设置接收推送的用户 以及推送的消息内容 并发给苹果服务器
7、苹果服务器根据 deviceToken 向用户发送设置好的推送消息
8、手机端接收到推送消息 在自己的应用中显示
NSArray 和 NSSet的区别?
NSSet :
1、无序的、不重复的;存放到NSSet中的内容并不会排序与添加顺序也没有关系
2、通过anyObject来访问单个元素
3、遍历NSSet中的每个元素。通过forin循环来遍历
4、好处:效率高。
5、应用场景:
比如重用Cell的时候,从缓存池中随便获取一个就可以了,无需按照指定顺序来获取
当需要把数据存放到一个集合中,然后判断集合中是否有某个对象的时候
*NSArray
1、有序的、可以有重复对象。对象的顺序是按照添加的顺序来保存的
2、好处:有序访问
3、应用场景:在绝大多数需要依赖顺序的情况下(比如tableView的数据源集合,在实际操作中要根据下标来获取对象)
4、通过下标来访问
收藏、最近
收藏和最近主要就是使用工具类对数据进行增加和删除,保存数据时要重写数据的equalto方法(因为计算机是根据内存地址比较的,而有时候内存地址虽然不同,但是储存的数据确实一样的,所以一般根据数据的位置标识(例如id值)比较)
如果是做最近,就需要将上一次的数据删除,添加新的数据进来,如果在搜藏是需要记录控件的编辑和选中状态,就需要在数据模型中添加相应的属性,利用数据来控制控件的状态
常出现的问题就是使用tableview时会出现循环利用的问题,这个问题就可以使用数据的值来避免,每次加载cell时,他的状态是受数据控制的,数据不会发生循环利用的问题,这个问题也就不会出现了
加载本地图片有哪些方法?
1、imageNamed
2、dataWithContentsOfFile
3、使用[UIImage imageWithContentOfFile:] 或者[image initWithContentOfFile:]
这些知识我整理的一小部分,如果有什么错误,希望指出,我们共同进步。