iOS面试笔试 技术向

面试

1、OC语言的基本特点 优缺点

objc优点:
1) Cateogies
2) Posing
3) 动态识别(多态用到才去识别)
4) 指标计算
5)弹性讯息传递
6) 不是一个过度复杂的 C 衍生语言
7) Objective-C 与 C++ 可混合编程
缺点:
1) 不支援命名空间
2) 不支持运算符重载
3)不支持多重继承
4)使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低。

2、#import与@class的区别

import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器。其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你。

3、简述类目优点和缺点,如果覆盖本类或者父类的方法,会出现什么问题

优点:不需要通过增加子类而增加现有类的方法,且类目中的方法与原始类方法基本没有区别
缺点:无法向类目中添加实例变量
出现的问题:覆盖后原始类的方法没办法调用 注意这里不是方法重写

4、简述内存管理的基本原则

MRC黄金法则:当你使用alloc、copy(mutableCopy)或者retain一个对象时。你必须使用相应的release或者autorelease将其释放
ARC自动管理:自动引用计数

5、什么是ARC技术?什么是GC?他们有什么区别

ARC我们称之为自动引用计数,本质还是MRC只是在我们编写代码的时候不需要去手动释放内存编译器会自动管理内存
GC既内存垃圾回收机制 Mac10.8之后不再支持GC(移动端不存在GC)
从iOS和Android的内存使用情况来看ARC明显好于GC

6、深,浅复制的基本概念以及他们的区别

浅复制:只复制对象本身(指针地址),不对里面的属性复制
深复制:不仅复制对象本身,(指针指向的地址),对象持有的属性对象也做复制;

7、内存中的堆取和栈区的差别

栈区(stack)由编译器自动分配释放,存放方法(函数)的参数值,局部变量的值等
堆取(heap)一般由程序员分配与释放,如程序员不释放,则内存溢出
静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。
栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。

8、用户自定义了一个对象,如何实现拷贝(可变和不可变拷贝)

必须实现copying和mtableCopying协议,表示返回一个不可变和可变的对象。否则,程序会出现异常

- (id)copyWithZone:(NSZone *)zone
{
    Person *person=[[self Class] allocWithZone:zone];
    person->age=self.age;
    person->name=self.name;
    return person;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{
    Person *person=[[self Class] allocWithZone:zone];
    person->age=self.age;
    person->name=self.name;
    return person;
}

9、strong与weak _unsafe_unretained与weak的区别

strong与weak:strong强引用,weak弱引用,在ARC中,使用strong告诉编译器帮助我们自动插入reatin,weak是普通赋值相当于手动管理内存中的assign
_unsafe_unretained与weak:他们的功能一致,区别在于当指向对象销毁后,weak会将变量直为nil,防止调用野指针

10、ARC中存在内存泄漏吗?举个例子

存在 当两个强引用(strong)同时指向一块内存的时候将释放不掉

Person * p = [[Person alloc] init];
NSMutableArray * arr = [[NSMutableArray alloc] init];
[arr addObject:p];

把对象从集合中移除的时候,也会释放掉这个对象的强指针
[arr removeObject:p];
或者[arr removeAllObjects];
而接下来才是重点不进行下面的两步p内存将不会被释放
arr = nil;//如果不进行赋值为nil的操作,一样存在内存溢出的现象,赋值为nil系统会对其进行清空所有强指针的操作.
p = nil;

11、自动释放池是什么,如何工作

自动释放池是NSAutorelease类的一个实例,当向一个对象发送autorelease消息时,该对象会自动会自动入池,待销毁时,将会向池中所有对象发送一条release消息,释放对象

12、为什么delegate属性都是assign而不是strong的?

防止循环引用,当签署代理的时候如果使用strong就会造成相互持有,以至于对象无法释放

13、iOS开发中数据持久化有几种?

plist文件、对象归档、sqlite3数据库、coredata、NSUserDefault

14、什么是KVC和KVO?他们之间的关系是什么?

KVC:键值编码是一种间接访问对象实例变量的机制,该机制不通过存取方法就可以访问对象的实例变量
KVO:键值观察是一种能使得对象获取到其他对象属性变化的通知机制。
关系:实现KVO模式被观察的独享必须使用KVC简直编码来修改它的实例变量,这样才能被观察者观察到。因此KVC是KVO的基础或者说KVO的实现是建立在KVC的基础之上的。

15、简述常见的设计模式

单例、代理、通知、工厂、策略

16、内存管理在dealloc方法中,用release方法好还是用=nil好?

使用=nil方法更好,因为先调用了release方法,而且将变量置为nil,这样就更安全的释放对象,防止野指针调用

17、线程与进程的区别和联系

一般应用程序是单个进程,多个进程需要多个CPU,进程是静态的容器,里面容纳多个线程,线程是一些列方法的现行执行路径。

18、delegate、Notification、block的使用区别

delegate与block一般用于两个对象一对一之间的通信交互,delegate需要定义协议方法,代理对象实现协议方法,并且需要建立代理关系才可以实现通信,代理的好处是代码的可读性比较高,如果通信事件比较多的话,建议使用delegate。
block更加简洁,不需要定义繁琐的协议方法,而且由于block的机制我们可以直接使用局部变量
Notification主要用于一对多情况下通信,而且通信对象之间不需要建立关系。但是使用通知的代码可读性较差。

19、事件响应者链的概念

响应者链表示一个系列的响应者对象。事件被交由第一响应者对象处理,如果第一响应者不处理,事件被沿着响应者链向上传递,交给下一个响应者。一般来说,第一响应者是视图对象或者子类对象,当其被触摸后事件被交由它处理,如果它不处理,事件就会被传递给它的父视图对象(如果存在),然后是它的视图控制器(如果存在),以此类推,直到顶层视图。接下来会沿着顶层视图到窗口。再到程序。如果整个过程都没有响应这个事件,该事件就会被丢弃。一般情况下在响应者链中只要由对象处理事件,事件就停止传递。但我们可以控制是否继续传递。

20、C语言中static变量和static函数有什么作用

static变量:表示变量是静态存储变量,表示变量存放在静态存储区
static函数:表示只在本文件中有效,别的文件中不能应用该函数

21、指针

int a;//一个数值
int *a;//一个指向数值的指针
int **a;//一个指向指针的指针
int a[10];//一个有10个指针的数组,该指针指向一个整型数组
int *a[10];//一个有10个指针的数组,该指针指向一个整型数组
int (*a)[10];//一个指向有10整型数的数组的指针
int (*a)(int);//一个指向函数的指针,该函数有一个整型参数并返回一个整形数
int (*a[10])(int);//一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型值

22、c和objc以及c++和objc如何混用,

实现文件的扩展名.m改成.mm即可。但cpp文件只能用c/c++代码,而且cpp文件include的头文件中,也不能出现oc的代码,因为cpp只能写c++的代码

23、OC中有私有方法,私有变量吗?

使用private修饰的全局变量是私有的变量
OC在语法上没有私有方法,不过可以通过延展在实现文件里定义方法作为私有方法,但是 不是真正意义上的私有方法,也是可以调用的,只是外部不可见

24、const的使用

const int a; a是一个常整型数
const int *a;a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)
int *const a;a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但是指针是不可修改的)

25、C语言中extern的作用,extern c的作用

extern可以置于变量或者函数前,以表示变量或者函数定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义
C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言不会,这告诉编译器,请保持我的名称,不要给我生成用于连接的中间函数名

26、什么是多态

不同对象以自己的方式响应相同的消息的能力叫做多态
声明的一个变量,在运行的时候绑定不同的对象,比如在方法的参数中声明一个变量UIView *view,运行的时候我们可以根据不同的应用场景给view变量传入不同的对象,可以传一个UIButton,也可以传入UIImageView对象。

27、cocoa touch框架

UIKit、Foundation、CoreGraphic、CoreAnimation
音频和视频:Core Audio、OpenAL、Media Library、AV Foundation
数据管理:Core Data、SQLite
图形和动画:Core Animation OpenGL ES、Quartz 2D、Core Graphic
用户应用:Address Book、Core Location、Map Kit、Store Kit

28、栈结构与队列的区别

栈(Stack):是限定只能在表的一段进行插入和删除操作的线性表。
队列(Queue):是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。
队列先进先出、栈先进后出;
遍历速度不同。队列遍历数据快;

29、单例 为什么使用单例

+(SingleCase *)sharedManager
{
    static SingleCase *ManagerInstance=nil;
    static dispatch_once_t predicate;
           dispatch_once(&predicate, ^{  
                ManagerInstance = [[self alloc] init];   
        });
    return ManagerInstance;  
}

单例设计是用来限制一个类只能创建一个对象,那么此对象中的属性可以存储全局的共享的数据,所有的类都可以访问、设置此单例对象中的属性数据
如果一个类创建的时候非常耗费性能,那么此类可以设置为单例节约性能

30、你对id的理解

id可以理解为指向对象的指针。所有oc的对象 id都可以指向,编译器不会做类型检查,id调用任何存在的方法都不会在编译阶段报错,当然如果这个id指向的对象没有这个方法,该崩溃还是会崩溃的。

31、UIButton的父类是谁?UIView呢?

UIButton的父类是UIControl,UIControl的父类是UIView,UIView的父类是UIResponder,UIResponder的父类是NSObject

32、http状态码

http状态吗 :302 是请求重定向。500以上是服务器错误。400以上是请求链接错误或者找不到服务器。200以上是正确。100以上是请求接受成功。

33、dispatch_group_async、dispatch_barrier_async、dispatch_apply分别是什么?

dispatch_group_async 可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了
dispatch_barrier_async 是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行
dispatch_apply 执行某个代码片段N次。

34、区分nil、Nil、NULL

nil和C语言的NULL相同,在objc/objc.h中定义。nil表示一个Objctive-C对象,这个对象的指针指向空(没有东西就是空)。
首字母大写的Nil和nil有一点不一样,Nil定义一个指向空的类(是Class,而不是对象)。

35、AppDelegate扮演着什么样的角色

AppDelegate作为UIApplication的委托,一般我们可以通过类方法[UIApplication shareApplication]来获取对UIApplication,在UIApplication接收到系统事件和生命周期事件时,会把相应的事件传递给UIApplicationDelegate进行处理

36、什么是cocoa/cocoa touch

cocoa是os开发环境 cocoa touch是iPhone开发环境

37、iBeacons是什么?

iBeacons是苹果在2013年WWDC上推出一项基于蓝牙4.0(Bluetooth LE | BLE | Bluetooth Smart)的精准微定位技术,当你的手持设备靠近一个Beacon基站时,设备就能够感应到Beacon信号,范围可以从几毫米到50米。功耗相当小

38、iOS应用是如何实现后台多任务处理(Multitasking)的?

ios7之后(一个app可以混合调用多种模式):Background Audio、VoIP、Location Services、Newsstand、Background Task Completion、Background Fetch 、Remote Notification、Background Transfer Service

39、Cocoa Touch包含什么?

除 UIKit 之外,Cocoa Touch 包含创建世界一流 iOS 应用程序所需的所有框架,从 3D 图形、专业音频到网络,甚至提供特殊设备访问 API 以控制摄像机或从 GPS 硬件获取位置。Cocoa Touch 既包含只需要几行代码就可以完成全部任务的强大的 Objective-C 框架,也在需要时提供基础的 C 语言 API 来直接访问系统。这些框架示例包括:
Core Animation
通过 Core Animation,您就可以通过基于组合独立图层的简单编程模型来创建丰富的用户体验。
Core Audio
Core Audio 是播放、处理和录制音频的专业级技术,能够轻松为您的应用程序添加强大的音频功能。
Core Data
Core Data 提供面向对象的数据管理解决方案,该方案易于使用和理解,甚至可处理任何应用或大或小的数据模型。

笔试

1、CALaye和UIView的区别是什么?

最大的区别是:UIview可以响应点击事件CALayer不可以
图层不会直接渲染到屏幕上,UIView是iOS系统中界面元素的基础,所有的界面元素都是继承自它。它本身完全由CoreAnimation来实现。他真正的绘图部分,是由一个CALayer来管理。UIView本身更像一个CALayer的管理器。一个UIView可以有n个CALayer,每个layer显示一种东西,增强UIView的展现能力

2、什么是GCD

GCD是Apple开发的一个多核编程的较新的解决方法。在Mac OS X10.6中首次推出。GCD是一个替代诸如NSThread等技术很高效和强大的技术。GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题。

3、TCP/UDP区别联系

TCP:传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。 (MSN)
UDP:用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快 (QQ)

4、socket连接和http连接的区别

简单说,你浏览的网页(网址以http://开头)都是http协议传输到你的浏览器的, 而http是基于socket之上的。socket是一套完成tcp,udp协议的接口。
HTTP协议:简单对象访问协议,对应于应用层 ,HTTP协议是基于TCP连接的
tcp协议: 对应于传输层
ip协议: 对应于网络层
TCP/IP是传输层协议,主要解决数据如何在网络中传输;而HTTP是应用层协议,主要解决如何包装数据。
Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
**http连接:http连接就是所谓的短连接,即客户端向服务器端发送一次请求,服务器端响应后连接即会断掉;
socket连接:socket连接就是所谓的长连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉;但是由于各种环境因素可能会是连接断开,比如说:服务器端或客户端主机down了,网络故障,或者两者之间长时间没有数据传输,网络防火墙可能会断开该连接以释放网络资源**
Socket是一个针对TCP和UDP编程的接口,你可以借助它建立TCP连接等等。而TCP和UDP协议属于传输层 。
而http是个应用层的协议,它实际上也建立在TCP协议之上。
(HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。)
Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口。

5、什么是TCP连接的三次握手

第一次握手:客户端发送syn包到服务器,并计入SYN_SEND状态,等待服务器的确认;
第二次握手:服务器收到syn包,必须确认客户的SYN,同时自己也发送一个syn包,即SYN+ACK包,此时服务器进入SYN_RECY状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手

6、frame与bounds的区别

Frame指的是:该view在父view坐标系统中的位置和大小(参照点是父视图的坐标系统)
Bounds指的是:该view在本身坐标系统中的位置和大小(参照点是本身的坐标系统)

7、如何理解MVC设计模式

MVC是一种架构设计,M数据模型model,V视图View,C控制器controller
model:负责存储定义操作数据
view:用来展示数据给用户,和用户进行操作交互
controller:是model与view的协调者,控制器获取数据,将数据交给视图展示

8、控制器的loadView方法是什么时候调用的,viewWillAperar什么时候调用

loadView:当控制器的根视图View为空,且此view被访问时调用
viewWillApear:当控制器根视图view被添加到父视图上时调用

9、控制器的xib是怎么加载的

当UIViewController的loadView被调用时,在此方法中,通过NSBundle加载Xib,先通过控制器的类名作为xib文件加载此xib文件。如果找到此xib文件,则加载为view对象作为控制器的根视图,如果没有xib文件,则通过alloc创建一个view对象作为根视图

10、内存不足,系统发出警告,此时控制器应该如何处理

内存不足时。系统会调用控制器的didReceiveMemoryWarning方法通知控制器内存不足
当didReceiveMemoryWarning方法被调用的时候我们调用 self.view=nil方法释放子视图

11、如何监听View的触摸事件、事件是如何传递的、视图的响应者链是什么?

监听触摸事件:覆写view的touchBegain、touchMove、touchEnd系列方法监听视图的触摸
事件的传递:当触摸一个视图时,首先系统会捕捉此事件,并为此事件创见一个UIEvent对象,将此对象加入到当前应用程序的时间队列中。然后由UIWindow对象分发个触摸的视图对象,也就是第一响应者对象。
响应者链表示一个系列的响应者对象。事件被交由第一响应者对象处理,如果第一响应者不处理,事件被沿着响应者链向上传递,交给下一个响应者。一般来说,第一响应者是视图对象或者子类对象,当其被触摸后事件被交由它处理,如果它不处理,事件就会被传递给它的父视图对象(如果存在),然后是它的视图控制器(如果存在),以此类推,直到顶层视图。接下来会沿着顶层视图到窗口。再到程序。如果整个过程都没有响应这个事件,该事件就会被丢弃。一般情况下在响应者链中只要由对象处理事件,事件就停止传递。但我们可以控制是否继续传递。

12、block在内存管理上的特点、如何解决循环引用

特点:block中使用了局部对象,则此对象将会被retain,引用了当前对象的属性或者方法,则会将当前对象retain
解决循环引用:将当前对象赋给一个局部变量,并且使用__block关键字修饰该局部变量,使用该变量访问当前对象 的属性和方法(__block typeof(self)weakself=self)

13、timer的间隔周期准吗?为什么?怎样实现一个精准的timer?

定时器timer一般都是准确的、但是当主线程有些时候出现阻塞(UI都是在主线程运行 加载视图就会阻塞)的情况,这样就可能导致timer会延迟。我们可以开辟子线程运行定时器

14、Http协议的特点,GET请求与POST请求的区别,什么事HTTPS协议

特点:短连接当服务端接收到请求并处理请求后关闭连接
区别:GET请求没有请求体,POST含有请求体,请求参数可以放入请求体重所以POST可以提交大量的数据个服务器
HTTPS:安全超文本传输协议他是一个安全通信通道,它基于HTTP开发,用于客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说他是HTTP的安全版

15、xml数据解析方式,各有什么不同,json解析有哪些框架

解析方式:DOM解析与SAX解析
异同:DOM解析必须先完成DOM树的构造,在处理较大的XML文档时比较耗内存,占用资源较多SAX解析XML文档时每遇到一个开始或者结束标签或者属性、或者一条指令时,程序就产生一个事件进行相应的处理,因此SAX对于DOM来说更适合操作大的XML文档
iOS原生json解析框架:NSJSONSerialization

16、用过哪些开源网络框架、各有什么特点

ASIHTTPRequest
优点:出来比较早、功能强大、文档丰富
缺点:停止更新、新特性少、厚重
AFNetWorking
优点:支持比较新的特性、简单易用
缺点:文档数目一般、功能少、没有同步请求
MKNetworkKit
优点:支持ARC、有ASIHTTPRequest的功能,AFNetWorking的轻便
缺点:有一些小bug

17、iOS中有哪些数据持久化的方式,各有什么特点,iOS平台怎么做数据的持久化?CoreData和sqlite有没有必然联系?CoreData是一个关系型数据库吗?

方式:属性列表、对象归档、SQLite数据库、CoreData
iOS怎么持久化:混合使用
CoreData与sqlite是有联系的,CoreData是对sqlite的封装,因为sqlite是c语言的api,然而有人也需要oc 的api,所以有了 CoreData另外,CoreData不仅仅是把c的api翻译成oc 的api,还提供了一些管理的功能,使用更加方便。

18、iOS如何捕捉异常

前言:在开发APP时,我们通常都会需要捕获异常,防止应用程序突然的崩溃,防止给予用户不友好的体验。其实Objective-C的异常处理方法和JAVA的雷同,懂JAVA的朋友一看就懂。

以下程序已测试并通过:

设备:iOS 8模拟器中

开发工具:XCode6.1

使用@try、catch捕获异常:

以下是最简单的代码写法,其中@finally可以去掉:

@try {
    // 可能会出现崩溃的代码
}
@catch (NSException *exception) {
    // 捕获到的异常exception
}
@finally {
    // 结果处理
}

在这里举多一具比较详细的方法,抛出异常:

@try {
    // 1
    [self tryTwo];
}
@catch (NSException *exception) {
    // 2
    NSLog(@"%s\n%@", __FUNCTION__, exception);
//        @throw exception; // 这里不能再抛异常
}
@finally {
    // 3
    NSLog(@"我一定会执行");
}
// 4
// 这里一定会执行
NSLog(@"try");
tryTwo方法代码:
- (void)tryTwo
{
    @try {
        // 5
        NSString *str = @"abc";
        [str substringFromIndex:111]; // 程序到这里会崩
    }
    @catch (NSException *exception) {
        // 6
//        @throw exception; // 抛出异常,即由上一级处理
        // 7
        NSLog(@"%s\n%@", __FUNCTION__, exception);
    }
    @finally {
        // 8
        NSLog(@"tryTwo - 我一定会执行");
    }

    // 9
    // 如果抛出异常,那么这段代码则不会执行
    NSLog(@"如果这里抛出异常,那么这段代码则不会执行");
}

为了方便大家理解,我在这里再说明一下情况:
如果6抛出异常,那么执行顺序为:1->5->6->8->3->4
如果6没抛出异常,那么执行顺序为:1->5->7->8->9->3->4

2)部分情况的崩溃我们是无法避免的,就算是QQ也会有崩溃的时候。因此我们可以在程序崩溃之前做一些“动作”(收集错误信息),以下例子是把捕获到的异常发送至开发者的邮箱。

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
    return YES;
}

void UncaughtExceptionHandler(NSException *exception) {
    /**
     *  获取异常崩溃信息
     */
    NSArray *callStack = [exception callStackSymbols];
    NSString *reason = [exception reason];
    NSString *name = [exception name];
    NSString *content = [NSString stringWithFormat:@"========异常错误报告========\nname:%@\nreason:\n%@\ncallStackSymbols:\n%@",name,reason,[callStack componentsJoinedByString:@"\n"]];

    /**
     *  把异常崩溃信息发送至开发者邮件
     */
    NSMutableString *mailUrl = [NSMutableString string];
    [mailUrl appendString:@"mailto:[email protected]"];
    [mailUrl appendString:@"?subject=程序异常崩溃,请配合发送异常报告,谢谢合作!"];
    [mailUrl appendFormat:@"&body=%@", content];
    // 打开地址
    NSString *mailPath = [mailUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:mailPath]];
}

19、单元测试

iOS自带单元测试框架OCUnit,但目前最好的测试框架应该是GHUnit

20、 OC有多继承吗?有什么替代方案

OC没有多继承,可以通过实现协议替代。OC是单继承,所有的类全都继承于NSObject,
但是在协议的遵守上却允许使用多继承。所以可以用协议来实现多继承

21、苹果APP的上架流程、什么情况下会被打回

上架流程:
1)在苹果网站的开发者中心,新建一个APP,填写此APP相关的一些描述信息
2)下载安装发布证书
3)选择发布证书,使用Archive编译发布包
4)使用Xcode提交发布包
被打回:
1)访问私有API
2)APP有严重的BUG
3)给苹果审核的测试账号无法登陆,或者境外无法访问国内服务器
4)APP加载时间过长,iOS APP的最长启动时间不得超过15秒
5)给出外部购买链接
6)APP描述中带有”Beta“字样,或者其他表明APP还未开发完成的信息
7)APP描述中提到了iOS之外的其他支持平台
··········

22、tableView是如何复用的

如果屏幕上能显示10个单元格,则tableView只会创建11个单元格(n+1),当滑倒第12个单元格时就会复用第一个单元格对象。tableView中有个复用池概念,tableView调用协议方法获取单元格时,先从复用池中查找是否有可用的单元格如果有则复用,如果没有则创建一个单元格对象

23、如何优化tableView的滑动速度

1)复用单元格
2)使用不透明的视图,单元格中尽量少使用动画
3)图片加载使用异步加载,并且设置图片加载的并发数
4)滑动式不加载图片,停止滑动开始加载
5)文字、图片可以直接drawInRect绘制
6)如非必要,减少reloadData全部cell,只reloadRowsAtInexPaths
7)如果cell是动态行高,计算高度后缓存
8)cell高度固定的话直接用cell.rowHeight设置高度

24、ASI网络框架有哪些功能

不支持ARC

25、了解Socket通信方式吗?

Socket通信是通过TCP/IP协议,实现客户端与服务器端之间的通信方式,客户端通过三次握手与服务器建立可靠的连接,然后进行数据传输

26、runloop的理解

runloop是线程相关的基础框架的一部分。一个runloop就是一个事件处理的循环,用来不停地调度工作以及处理传入事件,使用runloop的目的释然你的线程在有工作的时候忙于工作,没有工作的时候处于休眠状态。

27、如何调用drawRect方法与layoutSubView方法,这两个方法的作用

通过setNeedsLayout方法异步调用layoutSubView方法
通过setNeedsDisplay方法异步调用drawRect方法
drawRect方法用于绘图,layoutSubView方法用于布局子视图

28、二维码扫描用过哪些类库,这些类库有什么特点?

二维码生成:QRGener
二维码扫描:zxing(自定义扫描区域)、ZBarSDK

29、iOS5,6、7、8、9都有什么新特性

iOS5:iCloud、定制UI、storyBoard、ARC、coreimage路径,新增JSON解析类
其他:6、7、8、9新特性

30、storyBoard的优缺点

优点:开发界面所见即所得,可以快速通过拖拽构造界面。
缺点:xib 对版本管理是灾难,storyBoard是多个xib的集合一样难以管理

31、如何打包静态库

新建一个Framework&Library的项目,编译的时候,会将项目中的代码打包成一个.a的静态库文件。

32、SVN、Git协作开发,怎么防止代码文件冲突?

防止冲突:SVN不要多人同时修改同一个文件。例如A/B都修改同一个文件,先让A修改,然后提交到服务器,然后B更新下来,在进行修改。Git服务器上的项目文件,仅让一个人管理提交,其他人只更新。

33、断点续传是如何实现的?

其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已。 打个比方,浏览器请求服务器上的一个文时,所发出的请求如下: 假设服务器域名为w www.sjtu.edu.cn,文件名为down.zip。 GET /down.zip HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms- excel, application/msword, application/vnd.ms-powerpoint, / Accept-Language: zh-cn Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Connection: Keep-Alive 服务器收到请求后,按要求寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下: 200 Content-Length=106786028 Accept-Ranges=bytes Date=Mon, 30 Apr 2001 12:56:11 GMT ETag=W/”02ca57e173c11:95b” Content-Type=application/octet-stream Server=Microsoft-IIS/5.0 Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT 所谓断点续传,也就是要从文件已经下载的地方开始继续下载。所以在客户端浏览器传给 Web服务器的时候要多加一条信息–从哪里开始。 下面是用自己编的一个”浏览器”来传递请求信息给Web服务器,要求从2000070字节开始。 GET /down.zip HTTP/1.0 User-Agent: NetFox RANGE: bytes=2000070- Accept: text/html, image/gif, image/jpeg, ; q=.2, /*; q=.2 仔细看一下就会发现多了一行RANGE: bytes=2000070- 这一行的意思就是告诉服务器down.zip这个文件从2000070字节开始传,前面的字节不用传了。 服务器收到这个请求以后,返回的信息如下: 206 Content-Length=106786028 Content-Range=bytes 2000070-106786027/106786028 Date=Mon, 30 Apr 2001 12:55:20 GMT ETag=W/”02ca57e173c11:95b” Content-Type=application/octet-stream Server=Microsoft-IIS/5.0 Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT 和前面服务器返回的信息比较一下,就会发现增加了一行: Content-Range=bytes 2000070-106786027/106786028 返回的代码也改为206了,而不再是200了。 知道了以上原理,就可以进行断点续传的编程了。

34、使用GCD加载一个网络图片

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
    NSURL * url = [NSURL URLWithString:@"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"];  
    NSData * data = [[NSData alloc]initWithContentsOfURL:url];  
    UIImage *image = [[UIImage alloc]initWithData:data];  
    if (data != nil) {  
        dispatch_async(dispatch_get_main_queue(), ^{  
            self.imageView.image = image;  //当操作UI的时候回到主线程
         });  
    }  
}); 

你可能感兴趣的:(笔记)