iOS面试题总结

Objective-C相关:

继承

OC中有无多继承?

没有,一个类只能有一个父类;

怎么实现多继承的效果呢?

通过协议protocol来实现的;

继承关系中有两个重要的特性

重写:指子类重新实现一个与父类具有相同的方法名、返回类型和参数的方法;

重载:指子类实现一个与父类具有相同的方法名、参数个数,不同的参数类型和返回值类型的方法;OC中是没有真正的重载;可以通过增加参数个数和描述来实现重载;主要是OC中对函数名的规定和C不同,参数的描述也是参数名的一部分;

多态

什么是多态

不同对象以自己的方式响应相同消息的能力。

OC中多态的实现

通过id类型和动态绑定机制来实现。

id类型

id类型的变量可以存放任何数据类型的对象。在内部处理上,这种类型被定义为指向对象的指针,实际上是一个指向这种对象的实例变量的指针。id类型是多态和动态绑定的基础。

static(静态)关键字

作用

static修饰的全局变量,会存储在静态数据区,在程序刚开始运行时完成唯一的一次初始化,但限制其作用域,只在当前.m文件中使用;

static全局变量与普通的全局变量有什么区别 ?

两者都是静态存储方式;在程序运行的第一时间初始化。

区别在于作用域不同:

普通的全局变量:作用域是整个源程序;

static全局变量:作用域是定义该变量的当前源文件;

浅拷贝和深拷贝

浅拷贝:只拷贝了对象的指针,并没有拷贝对象内存中的资源;

深拷贝:不仅拷贝了指针,还开辟了新的内存,拷贝了原对象内存中的资源;

OC中的内存管理

黄金法则

引用计数

自动释放池的运行机制

http://my.oschina.net/u/1428392/blog/293597

ARC下的__strong、__weak修饰符

ARC下的对象默认都是添加了__strong修饰符的,表示强引用;

当为了避免循环引用时,可以在对象前添加__weak修饰符来修饰对象,表示弱引用。

ARC下如何使用不支持ARC的第三方库呢?

给.m文件加标记"-fno-objc-arc"

如何检查内存泄露?

通过开启Scheme(运行方案)中的Enable Zombie Objects选项和使用Xcode自带的instruments工具来检查内存泄漏

property中属性修饰词

assign:用于基本数据类型(非对象),代理;

copy, retain:对象;

ARC下使用weak和strong来代替copy和retain;

weak相当于copy,strong相当于retain;

代理作为成员变量时,为什么要使用assign?

避免循环引用;

OC中类别、类扩展的作用和区别?

作用:可以在不获悉,不改变原来代码的情况下扩充类的方法或属性;

类别:不可以添加属性,只能添加方法,添加的方法可以不实现;

类扩展:是没有类别名的类别;可以添加属性;添加的方法必须实现;

视图之间传递参数的几种方法

1.单例

2.点语法

3.委托代理

4.通知中心

委托代理和通知中心

它们都可以用于在不同的视图间传递参数。

委托代理是1对1;

通知中心是1对多;

构建委托代理的3个步骤:

接口声明(创建协议,可单独创建,也可在被代理类中创建),

接口回调(被代理类创建Delegate成员变量),

接口实现(代理类,遵守协议,实现接口方法);

UI相关

应用程序的生命周期?

http://blog.csdn.net/totogo2010/article/details/8048652

UIViewController的生命周期?

http://blog.csdn.net/ryantang03/article/details/8264072

UITableViewCell

优化:

为什么要优化?

因为在自定义Cell时,会加入很多的UIView,UILabel、UIImageView等控件,当数据量大的时候,会增加大量的渲染时间,从而导致滑动卡顿的现象发生。

怎么优化?

重写drawRect方法,将图片、文字直接写入cell中。

CALayer

用途:

为UIView增加圆角、阴影等外观上的美化;

使用:

view.layer.cornerRadius = 10.0f;

如何做屏幕间的适配?

iOS6之前使用AutoResizing,停靠模式;

iOS6新增自动布局(AutoLayout), 使用约束;

如何做系统版本间的适配?

通过代码判断设备的型号和系统版本,再添加针对各个版本的处理。

判断代码为:[UIDevice currentDevice].model

数据相关

iPhone应用中如何保存数据?

有以下几种保存机制:

1.通过web服务,保存在服务器上;

2.使用plist文件保存基本的数据类型,比如字符串、数组、字典等;

3.通过NSCoder固化机制,将对象保存在文件中,一般是封装的类;

3.通过SQlite或CoreData保存在文件数据库中,针对大量的数据类的存储。

如果要新建一个类,对其实现归档,需要怎么做?

该类需要遵守<NSCoding>协议,实现协议中声明的编码和解码方法;

创建数据库,插入数据,查询数据的命令关键字?

create, insert, select;

CoreData

CoreData本身并不是数据库,它是Apple提供的对象持久化存储技术,由CoreData.framework框架提供支持,可以使用SQLite作为持久化存储的类型。

FMDB

一个常用的优秀的开源数据库

网络相关

实现网络功能的API

第三方:ASIHttpRequest

系统自带:NSURLConnection

ASI使用上的BUG有了解吗?

程序在后台时,会断开连接;

如果要显示下载进度,该怎么做?

同步和异步下载

同步请求:可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作。

异步请求:不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行。

PostGet

它们是HTTP的两种请求方法;

GET请求,将参数直接写在URL上。操作简单,但易被外界看到,安全性不高,地址最多255字节;

POST请求,将参数放到body里面。操作相对复杂,需要将参数和地址分开,安全性高。

JSON和XML

它们都是常用的数据交换格式。

JSON使用SBJson等解析;

XML使用GData等解析;

Socket

Socket是什么?

Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。Socket由IP地址和端口号唯一确定;

Socket通常用于实现客户方和服务方的连接;

连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

Socket连接和HTTP连接的区别?

http是基于socket之上的。socket是一套完成tcp,udp协议的接口。

TCP/IP是传输层协议,主要解决数据如何在网络中传输;

HTTP是应用层协议,主要解决如何包装数据;

http连接是短连接,即客户端向服务器端发送一次请求,服务器端响应后连接即会断掉;

Socket连接是长连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉;

TCPUDP

TCP(传输控制协议)是基于连接的协议,在正式收发数据前,必须和对方建立可靠的连接。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据的安全性、稳定性、正确性,但传输速度稍低;

建立TCP连接需要三次握手:1、主机A向主机B发送连接请求数据包;2、主机B向主机A发送同意连接和同步请求数据包;3、主机A向主机B发送确认请求数据包;

UDP(用户数据报协议)是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!传输速度快、但安全性、稳定性、数据的正确性低;

多线程相关

实现多线程的方法

NSThread

NSOperationQueue

GCD

什么时候使用多线程?

对于一些耗时的任务,比如从网络下载数据,需要放到子线程中运行。否则在主线程中长时间的等待,会降低用户体验度。

使用多线程会提高程序的运行效率吗?

不会。开辟过多的线程,反而会降低程序的运行效率。

子线程中使用NSTimer无效,是什么原因?如何解决?

因为子线程的runloop结束了,应该在子线程中添加以下代码

[NSRunloop currentRunloop] run];让runloop保持运行。

设计模式相关

你常用的设计模式有哪些?

MVC、委托代理、通知中心、单例、工厂、策略、装饰、中介者、观察者;

如何构建一个单例类?

1.声明一个类方法,作为单例类对外获取唯一实例的借口;

2.为单例对象实现一个静态实例,并初始化,然后设置成nil;

3.实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例;并使用dispatch_one或者@synchronized对实现代码加锁,保证线程安全;

4.重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例;

5.适当实现allocWitheZone,copyWithZone,release和autorelease。

工厂模式

1.工厂模式实质上:

是使用工厂类方法统一创建产品类实例,来代替产品类各自通过alloc方法创建实例。

2.好处:

易于修改和扩展产品类,而不必去修改主程序的相关代码。

3.怎么使用?

1)从多个产品类中抽象出产品基类或者是协议;

2)创建工厂类,并创建一个生产产品类实例的类方法,返回值为产品基类或者id <协议>, 参数为产品类型;

3)在需要创建产品类实例的地方,直接实用工厂类调用类方法来创建;

扩展相关

如何在一个程序打开其它应用程序?比如打开电话、邮件、短信等?

openURL

iPad开发

iPad开发独有的控件:UISplitViewController(分割视图)和UIPopoverController(泡泡视图)。

runloop

真机调试流程?

APP的上线和发布流程?

待添加

KVC和KVO
Block


转载于:https://my.oschina.net/u/2010888/blog/313123

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值