导航模式
平铺模式,一般由scrollView和pageControl组合而成的展示方式。手机自带的天气比较典型。
标签模式,tabBar的展示方式,这个比较常见。
树状模式,tableView的多态展示方式,常见的9宫格、系统自带的邮箱等展现方式。
持久化方式
属性列表文件 -- NSUserDefaults 的存储,实际是本地生成一个 plist 文件,将所需属性存储在 plist 文件中
对象归档 -- 本地创建文件并写入数据,文件类型不限
SQLite 数据库 -- 本地创建数据库文件,进行数据处理
CoreData -- 同数据库处理思想相同,但实现方式不同
单元测试框架
OCUnit 是 OC 官方测试框架, 现在被 XCTest 所取代。
XCTest 是与 Foundation 框架平行的测试框架。
GHUnit 是第三方的测试框架。github地址
OCMock都是第三方的测试框架。github地址
7 层协议,tcp四层协议及如何对应的?
@private、@protected与@public三者之间的区别
@private只能够使用在声明的类当中,其子类也不能够使用用@private声明的实例变量;
@protected只能在声明的类当中使用,但其子类具有使用@protected声明变量的资格;
@public可以全局使用,属性是具有全局属性的;
在OC中,引用文件可以通过#include、#import、@class三种方式。
一. #include
1. 在C语言中,我们使用#include来引入头文件。使用#include “xx.h”来引入自定义的头文件,使用#include来引入库中的头文件。
2. #include不是不能防止重复引用头文件,而是操作起来比较复杂。
3. #include:为了防止重复引用可采用:
#ifndef ViewController_h
#define ViewController_h
#endif
二. #import
1. #import是#include的升级版,可以防止重复引入头文件这种现象的发生。
2. #import在引入头文件的时候,就是完全将头文件拷贝到现在的文件中。所以也有效率上的问题。
3. #import最大的问题在于,需要避免出现头文件递归引入的现象。(如:A引入B,B引入A,那么A、B的头文件会互相不停的拷贝)
三.@class
1. @class用来告诉编译器,有这样一个类,使书写代码时,不报错。
但是@class只是使导入的类名在引用时不受影响,不能创建该类的对象,因为创建对象时也需要访问其内部方法。
2. 因为#import引入头文件有效率问题,所以,当还没有调用类中方法,仅仅是定义类变量的时候,使用@class来提醒编译器。而在真正需要调用类方法的时候,进行#import。
3. 如果A是B的父类,那么这是在B.h中就必须要使用#import来引入A的头,因为需要知道A类中有哪些变量和方法,以免B类中重复定义。
Socket
建立Socket通信是至少需要一对套接字, 其中一个是运行在我们的客户端上, 称为Client Socket, 还有一个是运行在服务器上, 称为Service Socket.
Socket之间的连接过程分为三个过程:
服务器监听、客户端请求、连接确认。
Socket同时支持TCP和UDP两种传输协议, 啥意思呢?
当Socket使用TCP协议通信的时候, Socket就是一个TCP的连接, 那么如果Socket使用的是UDP协议通信, 那么这时候的Socket就是UDP连接
网络的协议,从上往下分的话:
应用层、表达层、会话层、传输层、网络层、数据链路层、物理层。
但我们通常会把底下三层(网络层, 数据链路层, 物理层)统称为媒体层, 一般都是专门搞网络的网络工程师大神们研究的对象;而上面四层(传输层, 会话层, 表示层, 应用层)被称为主机层, 也是广大用户所面向和关心的内容。
HTTP:
HTTP协议: 它是对应着应用层.
TCP协议: 它是对应着传输层.
IP协议: 则对应着网络层.
而HTTP协议是基于TCP连接的, 所以三者根本就没啥可比性.
TCP/IP协议: 属于传输层协议, 主要解决数据如何在网络中传输.
HTTP协议: 属于应用层, 主要解决如何包装数据.
而Socket是应用层与TCP/IP协议族通信中间的软件抽象层, 是它的一组接口
TCP/IP五层模型
应用层、传输层、网络层、数据链路层、物理层。
物理层: 中继器, 集线器, 双绞线
数据链路层: 以太网交换机(Modem), 网卡(网卡有一半是工作在物理层)
网络层: 路由器, 三层交换机
传输层: 四层交换机, 路由器(也有一些特殊的路由器在传输层中工作)
其中TCP/IP的应用层比较特殊, 它是包含了会话层, 表达层, 应用层等功能, 这里要说一点, TCP/IP协议并不能在传输层总是保证可靠的传输数据包, 但七层模型可以做到.
TCP/IP还提供了另一种传输模式, 叫做UDP(用户数据报协议), 但这种协议不能保证可靠的数据包传输
TCP: 面向连接, 提供可靠的数据传输, 用于传输大量数据, 使用数据流模式, 速度慢, 建立连接时开销较大
UDP: 非面向连接, 传输不可靠, 用于传输少量的数据, 速度快。
TCP是一个数据流的模式协议, 而UDP是一种数据报模式的协议.
总的来说TCP是一个数据流的模式协议, 而UDP是一种数据报模式的协议。刚刚说了Socket是基于TCP/IP协议上的抽象, 也就是说Socket只是对TCP/IP的封装, 本身是没有协议的, 只有通过Socket API, 我们才能够使用TCP/IP协议。
沙盒
每个iOS程序都有一个独立的文件系统(存储空间),而且只能在对应的文件系统中进行操作,此区域被称为沙盒。应用必须待在自己的沙盒里,其他应用不能访问该沙盒。所有的非代码文件都要保存在此,例如属性文件plist、文本文件、图像、图标、媒体资源等。
沙盒中相关路径
AppName.app应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以不能在运行时对这个目录中的内容进行修改,否则会导致应用程序无法启动。
Documents/保存应用程序的重要数据文件和用户数据文件等。用户数据基本上都放在这个位置(例如从网上下载的图片或音乐文件),该文件夹在应用程序更新时会自动备份,在连接iTunes时也可以自动同步备份其中的数据。
Library:这个目录下有两个子目录,可创建子文件夹。可以用来放置您希望被备份但不希望被用户看到的数据。该路径下的文件夹,除Caches以外,都会被iTunes备份.
Library/Caches: 保存应用程序使用时产生的支持文件和缓存文件(保存应用程序再次启动过程中需要的信息),还有日志文件最好也放在这个目录。iTunes 同步时不会备份该目录并且可能被其他工具清理掉其中的数据。
Library/Preferences: 保存应用程序的偏好设置文件。NSUserDefaults类创建的数据和plist文件都放在这里。会被iTunes备份。
tmp/: 保存应用运行时所需要的临时数据。不会被iTunes备份。iPhone重启时,会被清空。
// 获取沙盒根目录路径NSString*homeDir=NSHomeDirectory();
// 获取Documents目录路径NSString*docDir=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)firstObject];/
/获取Library的目录路径NSString*libDir=[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES)lastObject];
// 获取cache目录路径NSString*cachesDir=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)firstObject];
// 获取tmp目录路径NSString*tmpDir=NSTemporaryDirectory();
// 获取应用程序程序包中资源文件路径的方法:NSString*bundle=[[NSBundle mainBundle]bundlePath];