美文网首页
开发笔记 (二)

开发笔记 (二)

作者: ricefun | 来源:发表于2018-03-15 15:19 被阅读12次

OS 程序中的内存分配:栈 堆 全局 文字常量 代码
1.栈区(stack):由编译器自动分配并释放,存放函数的参数值,局部变量等。
优点:高效快速; 缺点:数据不灵活 [先进后出] 地址:高—>低 连续
2.堆区(heap): 由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收 ,比如在ios 中 alloc 都是存放在堆中 地址:低—>高 不连续
优点:灵活方便,数据适应面广泛,但是效率有一定降低
3.全局区(静态去)(static)全局变量和静态变量的存储是放在一起的, 初始化的全局变量和初始化的静态变量放在一块 未初始化的全局变量和未初始化的静态变量放在另一块区域
4.文字常量区 :存放常量字符串,程序结束后由系统释放
5.程序代码去 :存放函数的二进制代码

typeo 获得变量类型 typedef 给一个数据起一个别名 便于使用
.DS_Store 文件是用来存储这个文件夹的显示属性的:比如文件图标的摆放位置。

1.Instruments及其作用

分析代码 检测内存泄漏 程序耗时 cpu使用情况 检测文件读写等用于收集关于一个或多个系统进程的性能和行为的数据的工具

2.HealthKit是什么?
Healthkit 为第三方应用开发提供接口,从而可以让第三方应用可以访问苹果手机上的健康数据。

3.HomeKit是什么?
智能家居

4.iOS应用沙盒机制
是一种安全体系,它规定了程序只能在为该应用创建建文件夹内读取文件,不可以访问其他地方的内容。所有的非代码文件都保存在这个地方,比如图片,音视频,plist ,文本文件等
1.每个app都在自己的沙盒内
2.不能随意跨沙盒访问别的沙盒
3.应用程序在向外请求或者接受数据都需要经过权限认证

分为:
doucument:程序中创建的或者在程序浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录
libaray:储存程序默认的设置和其他信息 内包含cache:缓存文件 还有preference
tmp:临时文件

5.后台多任务
真后台和服务:用于 音乐播放,录制,定位服务,VoIP,蓝牙及外部设备通信
退到后台时,短时间延续之前执行的任务
在前台时初始化,但尚未完成的下载任务
真正意义的后台运行服务(新增了几种服务支持)

6.Cocoa/Cocoa Touch是什么?
Cocoa 是mac OSX系统上原生的一个编译环境,即一系列的类库,包含两个框架:Foundation和AppKit
在iphone ipad这些触摸设备上使用的是Cocoa的一个子类:Cocoa touch:(内有图形类库 uikit)
Cocoa包含Foundation和AppKit框架,可用于开发Mac OS X系统的应用程序。
Cocoa Touch包含Foundation和UIKit框架,可用于开发iPhone OS系统的应用程序。
CoreFundation->Fundation->NSObject….

7.响应链(Responder Chain)是什么?
Ios 当发生事件响应时,必须知道由谁来响应事件,这就是响应者链对事件进行响应,所有的响应的类都是UIResponder的子类响应者链是一个由不同对象组成的层次结构,其中的每个对象将依次获得响应事件消息的机会。当发生事件时,事件首先被发送给第一响应者,第一响应者往往是事件发生的视图,也就是用户触摸屏幕的地方。事件将沿着响应者链一直向下传递,直到被接受并作出处理。

一个典型的响应路线如下:

First Responder-->The Window-->The Application-->App Delegate.
下什么是响应者链条:

(1)响应者链是由多个响应者对象链接起来的队列;

(2)响应者对象是指能够处理事件的对象,也就是继承自UIResponder的对象;

(3)使用响应者链条,能够让一条链上的多个对象对同一事件作出响应;

(4)消息在响应者链上传递也就是想找到下一个响应的对象(nextResponder);

8.AppDelegate扮演着什么样的角色
apppdelegate为整个应用的一个代理,提供程序启动/退出等类似监控的接口

9.消息转发机制
处理消息的一个机制 防止程序崩溃 OC的运行时在程序崩溃前提供了三次拯救程序的机会
当向someObject发送某消息,但runtime sys在本类和其父类都找不到对应的方法时 runtime并不会马上报错
0

1.动态方法解析:向当前类发送 resolveInstanceMethod: 检查是否动态添加方法
2.备援接收者:检查该类是都实现了 forwardingtargetForSelector:方法 看看能不能把选择子转发给其他接收者处理
3.完整的消息转发 nsinvocation :runtime发送methodSignatureForSelector消息获取Selector对应的方法签名。返回值非空则通过forwardInvocation:转发消息,返回值为空则向当前对象发送doesNotRecognizeSelector:消息,程序崩溃退出。

10.ios开发 使用什么工具追踪bug
Redmine 是一个开源的、基于Web的项目管理和缺陷跟踪工具。

11。iOS runtime
所谓runtime就是指,在编译时并不关其具体的数据类型,到运行方法时,才去确实其具体的数据类型。

当我们调用某个对象的实例方法时,它会首先在自身isa指针指向的类(class)methodLists中查找该方法,如果找不到则会通过class的super_class指针找到父类的类对象结构体,然后从methodLists中查找该方法,如果仍然找不到,则继续通过super_class向上一级父类结构体中查找,直至根class;

当我们调用某个某个类方法时,它会首先通过自己的isa指针找到metaclass,并从其中methodLists中查找该类方法,如果找不到则会通过metaclass的super_class指针找到父类的metaclass对象结构体,然后从methodLists中查找该方法,如果仍然找不到,则继续通过super_class向上一级父类结构体中查找,直至根metaclass;

RunTime的应用:【1】消息的发送 【2】交换方法 【3】类/对象的关联对象 【4】动态的添加方法 【5】字典转模型的KVC实现

12.Run Loop
事件的响应 线程
NSRunloop
1.runloop就是一个do。。。while()函数,每个runloop都有一一对应的线程,并保存在一个全局的dictionary里面,线程被创建时 不主动获取(kvc),runloop是不会有的,runloop的销毁在线程结束后,主线程默认有个runloop
2.Thread 包含一个CFRunloop,一个CFRunloop包含一种CFRunLoopMode,mode包含CFRunLoopSource,CFRunLoopTimer和CFRunLoopObserver。
3.RunLoop只能运行在一种mode下,如果要换mode当前的loop也需要停下重启成新的。利用这个机制,ScrollView过程中NSDefaultRunLoopMode的mode会切换UITrackingRunLoopMode来保证ScrollView的流畅滑动不受只能在NSDefaultRunLoopMode时处理的事件影响滑动。同时mode还是可定制的。

13.请描述一下xib,Storyboard和标准NIB文件的差别
NIB其实是一个文件夹,里面有可执行的二进制文件;xib是一个基于xml的描述文件(纯文本),可以实现可视化编程。storyboard是多个xib文件集合的描述文件,也采用xml格式。

14.动态绑定(多态):解决父类调用子类的问题
动态类型:iOS动态类型(强类型)id可以在代码运行时判断对象的类型,使程序更加灵活
动态绑定:可在代码运行的时候判断需要调用什么方法,动态类型和动态绑定使得选择哪个接收者 及调用哪个方法都可以在运行时决定。
动态载入:可以根据需要加载可执行代码及资源,而不是在启动时就加载资源。
SEL类型:iOS在编译的时候,会根据方法的名字(包括参数序列),生成一个用来区分这个方法的唯一的ID,这个ID是SEL类型的,SEL的本质就是类方法的编号[函数地址]

15.uitableviewcell的重用机制
可变数组:NSMutableArray *visiableCells:用来保存存当前显示的cell;
可变字典:NSMutableDic *reuseTableCells :用来保存可重利用的cell;用字典保存是因为,cell样式可以有多种,根据不cell的reuseidentifier,就是所谓的重用标识符来查找该样式

16.NSNotification Delegate Block
通知:一对多,多对一传值 使用注意点是:控制器销毁时记得移除通知
代理:一对一 使用注意点:单利对象不能用代理!使用代理前,先用respondsToSeletor方法判断其代理是否符合协议,防止程序崩溃
Block:一对一 注意点:防止循环引用,内存泄漏

17.代理和block对比
代理成本低,block成本改,因为block要将书数据从栈内存拷贝到堆内存,当用完block 或者置为nil的时候,才会被消除,而代理只是一个对象指针,没有额外的消耗
代理需要写协议方法 代理实现方法 代码量较多,并且要先设置代理才能建立通信:block代码简洁很多 可读性强
Kvc:key value coding 一种通过字符串的名字(key)来访问类属性的机制
kvo:Key-value observing,是一种建立在kvc基础上的通知机制,当value 被改变时 或有消息发给观察者

18.单例
+(AppDelegate *)sharedAppdelegate{
static AppDelegate *delegate = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
delegate = [[self alloc]init];
});
return delegate;
}

用途:保证程序运行过程,一个类只有一个实例,而且该实例仅供外界访问
因为只有一个,所以很方便的控制实例的个数,节约系统资源

19.NSOperationQueue 和 GCD
NSOperationQueue:用于管理NSOperation 对象,控制线程并发数目,但面向对象,
GCD:简单 易用 并且使用block参数使代码更易读

20。assign vs weak,__block vs __weak
两个都是弱引用,不同是的 weak在对象被释放的时候会置为nil ,weak用于object type,就是指针类型,而assign用于简单的数据类型(非oc对象),如int BOOL 等。
block不可以修改局部变量,加上__block就可以修改
Block 会强引用对象,引起循环引用,__weak避免循环引用

21.UIView和CALayer是啥关系?
view持有layer用于显示,view大部分显示属性实际是从Layer映射而来的:view其实是layer的delegate,当layer的属性改变、动画产生时,view能够得到通知,响应变化;说白了就是UIview主要负责事件处理,CALayer负责绘制那就更好了

22.frame,bounds ,center
Frame:在父类坐标系统的位置和大小
bounds:在本身坐标的位置和大小
Center:该view的中心点在父view坐标系统中的位置和大小。(参照电是,父亲的坐标系统)
frame 是相对坐标。bounds是绝对坐标。

23.GCD里面有哪几种Queue?
穿行和并行。main queue是串行,global queue是并行

dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 执行耗时的异步操作...
dispatch_async(dispatch_get_main_queue(), ^{
// 回到主线程,执行UI刷新操作
});
});

队列组(同栅栏函数)dispatch_group_async\dispatch_group_notify
有这么1种需求: 首先:分别异步执行2个耗时的操作, 其次:等2个异步操作都执行完毕后,再回到主线程执行操作
如果想要快速高效地实现上述需求,可以考虑用队列组
dispatch_group_tgroup group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 执行1个耗时的异步操作
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 执行1个耗时的异步操作
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 等前面的异步操作都执行完毕后,回到主线程...
});
分类:1.将类的实现分散到多个不同文件或多个不同框架中
2.创建对私有方法的前向引用
3.向对象添加非正式协议
扩展:分类的一种特例:起名为匿名,,并且添加的方法一定要实现,因此又叫匿名分类
分类 增加方法 通过runtime去增加属性,利用关联来增加属性
扩展 增加属性 成员变量 方法声明

1. 简述push原理,push的证书和其它的右什么不一样?
 第 一阶段:BeejiveIM服务器把要发送的消息、目的iPhone的标识打包,发给APNS。
 第二阶段:APNS在自身的已注册Push服务 的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。
 第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。
2. viewcontroller的一些方法的说明viewDidLoad, viewWillDisappear, viewWillAppear方法的 顺序和 作用?
viewDidLoad 创建view
viewDidLoad:在视图加载后被调用
viewWillAppear:视图即将可见时调用。默认情况下不执行任何操作
viewDidAppear:视图已完全过渡到屏幕上时调用
viewWillDisappear:视图被驳回时调用,覆盖或以其他方式隐藏。默认情况下不执行任何操作
viewDidDisappear:视图被驳回后调用,覆盖或以其他方式隐藏。默认情况下不执行任何操作
先执行viewDidLoad再执行viewWillAppear。

3.当内存警告时,系统可能会释放UIViewController的view,将view赋值为nil,并且调用viewDidUnload方法

7。冒泡算法。

  • (NSMutableArray *)mySort :( NSMutableArray *) arr
    {
    int i,j,len;
    NSObject *temp;
    len=[arr count ];
    for (i=len- 1 ;i>= 0 ;i--)
    {
    for (j= 0 ;j<i- 1 ;j++)
    {
    if ([[arr objectAtIndex :j] compare:[arr objectAtIndex :j+ 1 ]]> 0 )
    {
    temp=[arr objectAtIndex :j];
    [arr replaceObjectAtIndex :jwithObject :[arr objectAtIndex :j+ 1 ]];
    [arr replaceObjectAtIndex :j+ 1withObject :temp];
    }
    }
    }
    return arr; }

void bubble_sort(int a[], int n);

void bubble_sort(int a[], int n)
{
int i, j, temp;
for (j = 0; j < n - 1; j++)
for (i = 0; i < n - 1 - j; i++)
{
if(a[i] > a[i + 1])
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}

int main()
{
int number[SIZE] = {95, 45, 15, 78, 84, 51, 24, 12};
int i;
bubble_sort(number, SIZE);
for (i = 0; i < SIZE; i++)
{
printf("%d", number[i]);
}
printf("\n");
}

10。uiview的圆角属性设置方法。
【1】//第一种方法:通过设置layer的属性
m_mainImgView.layer.cornerRadius= 6;
m_mainImgView.layer.masksToBounds= YES;

【2】使用贝塞尔曲线UIBeszierPath 和 Core Graphics 框架画出一个圆角

最佳
【3】使用贝塞尔曲线UIBeszierPath 和 CAShapeLayer 设置圆角

11。 masksToBounds属性的作用。
决定子layer是否被当前layer的边界剪切,默认是NO。

12.self. 和 _
self.propertyName是对属性的访问
_propertyName是对局部变量的访问
其一、@property的声明中,编译器在生成getter,setter方法时是有优先级的,它首先查找当前的类中用户是否已定义属性的getter,setter方法,如果有,则编译器会跳过,不会再生成,使用用户定义的方法。

也就是说你在使用self.propertyName 时是在调用一个getter方法。

self.propertyName 会让计数器+1;

其二、_propertyName,是直接调用变量,不通过getter方法。

_propertyName是类似于self->_propertyName。

用self.propertyName 是更好的选择,因为这样可以兼容懒加载,同时也避免了使用下划线的时候忽视了self这个指针,后者容易在block中造成循环引用。

同时,使用 _是获取不到父类的属性,因为它只是对局部变量的访问。
最后总结:self方法实际上是用了get和set方法间接调用,下划线方法是直接对变量操作。

库:代码程序代码的方式,一般分为静态库和动态

静态库:连接时需要完整拷贝到工程当中(或者可执行文件),被多次使用就有多分冗余拷贝 :.a/.framework
动态库:连接时不复制,程序运行时有系统动态加载到内存,工程序调用,系统只加载一次,多个程序共用,节省内存 :dylib/framework

系统的framework是动态库,自己建立的.framework是静态库

.a和.framework区别:
.a是一个纯二进制文件,不能直接使用,至少需要.h文件配合
.framework中除了二进制问价之外还有资源文件,可以直接使用
.a + .h +sourceFile = .Framework

App被拒总结************

  • 使用第三方登录时,未做安装检测 原因: 苹果在条款中有声明不允许 iOS 应用的正常使用需要依赖另外一个 App。

使用手机硬件时(摄像头,麦克风) 未在plist文件中声明访问权限
未提供测试账号(或测试账号中没有演示设备)
和硬件相关的 没有提供演示视频
第三方库的热更新

GET: 对资源的获取/查询 请求数据直接附在URL之后 不安全 服务器端用Request.QueryString 获取变量值 传送的数据量较小
POST: 对资源的更新 请求数据放置在HTTP包的包体中 安全 服务器端用Request.From获取提交数据 传送的数据量较大

TCP : 提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传输到另一端
UDP :(用户数据报协议),是一个简单的面向数据报的运输层协议,只负责吧数据发出去,但是不能保证他们能到达目的地,但是传输速度很快

                                                                          TCP                                             UDP

Client 和Server 是否需要建立连接 YES YES
对系统资源的要求 多 少
程序结构 复杂 简单
模式 流模式 数据报模式
数据正确性 保证 不保证 有可能丢包
数据顺序 保证 不保证
socket()的参数不同
UDP Server不需要调用listen和accept
UDP收发数据用sendto/recvfrom函数
TCP:地址信息在connect/accept时确定UDP:在sendto/recvfrom函数中每次均 需指定地址信息

TCP连接 三次握手
首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。

TCP断开 四次握手
【注意】中断连接端可以是Client端,也可以是Server端。
假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

copy 和 mutablecopy
如果对一不可变对象复制,copy是指针复制(浅拷贝)和mutableCopy就是对象复制(深拷贝)。如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的。

直播:

捕获音视频 —> 使用GPUImage—>美颜—> YUV、PCM数据的介绍和捕获 —> H264、aac、flv介绍—> 软硬编码 —> 音视频同步(时间戳)—> 转成flv —> 推流 rtmp协议 —> 解码 —> 播放

YUV >>>>H264 PCM>>>>AAC
YUV : y表示亮度 UV 色差
H264:I帧 关键帧,解码时只需要本帧
P帧 参考帧,表示这一帧与前一个关键帧(或P帧)的差别;
B帧是双向参考帧,表示本帧与前后帧的差别;(B帧压缩率高,解码复杂,直播中较少用)
IDR帧是第一个I帧,为的是和其他I帧区别开,方便控制编码和解码;
GOP(Group Of Picture)是图像组,是一组连续的画面;
帧内压缩:当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息;(帧内压 缩一般达不到很高的压缩,跟编码jpeg差不多)
帧间压缩:利用相邻帧的相关性提高压缩量,减少冗余;(运动补偿和运动估计是常用的技术)
a
视频的捕获:系统方法捕获、GPUIImage、CMSampleRef解析
美颜滤镜:GPUImage
视频变化:libYUV
H.264码流第一个 NALU 是 SPS(序列参数集Sequence Parameter Set)
H.264码流第二个 NALU 是 PPS(图像参数集Picture Parameter Set)
H.264码流第三个 NALU 是 IDR(即时解码器刷新)
二、TCP、UDP、HTTP、HTTPS之间的关系
TCP/IP是个协议组,可分为四个层次:网络接口层、网络层、传输层和应用层。在网络层,有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。在传输层,有TCP协议与UDP协议。在应用层,有WebSocket、FTP、HTTP、TELNET、SMTP、DNS等协议。因此,HTTP本身就是一个协议,是从Web服务器传输超文本到本地浏览器的传送协议。而HTTPS可以理解为更安全的HTTP协议。

HTTPS协议需要到ca申请证书,一般免费证书很少,需要交费。
HTTP是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的SSL加密传输协议。
HTTP和HTTPS使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
HTTP的连接很简单,是无状态的 。
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全。

相关文章

网友评论

      本文标题:开发笔记 (二)

      本文链接:https://www.haomeiwen.com/subject/wrehqftx.html