IOS-4-面试题1:黑马程序员IOS面试题大全

一、多线程网络

1. 多线程的底层实现?

1> 首先搞清楚什么是线程、什么是多线程

2> Mach是第一个以多线程方式处理任务的系统,因此多线程的底层实现机制是基于Mach的线程

3> 开发中很少用Mach级的线程,因为Mach级的线程没有提供多线程的基本特征,线程之间是独立的

4> 开发中实现多线程的方案

l C语言的POSIX接口:#include <pthread.h>

l OC的NSThread

l C语言的GCD接口(性能最好,代码更精简)

l OC的NSOperation和NSOperationQueue(基于GCD)

2.线程间怎么通信?

1> performSelector:onThread:withObject:waitUntilDone:

2> NSMachPort

3.网络图片处理问题中怎么解决一个相同的网络地址重复请求的问题?

利用字典(图片地址为key,下载操作为value)

4.用NSOpertion和NSOpertionQueue处理A,B,C三个线程,要求执行完A,B后才能执行C,怎么做?

// 创建队列

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

// 创建3个操作

NSOperation *a = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@”operation1---“);

}];

NSOperation *b = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@”operation1---“);

}];

NSOperation *c = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@”operation1---“);

}];

// 添加依赖

[c addDependency:a];

[c addDependency:b];

// 执行操作

[queue addOperation:a];

[queue addOperation:b];

[queue addOperation:c];

5.列举cocoa中常见对几种多线程的实现,并谈谈多线程安全的几种解决办法及多线程安全怎么控制?

1> 只在主线程刷新访问UI

2> 如果要防止资源抢夺,得用synchronized进行加锁保护

3> 如果异步操作要保证线程安全等问题, 尽量使用GCD(有些函数默认就是安全的)

6.GCD内部怎么实现的

1> iOS和OS X的核心是XNU内核,GCD是基于XNU内核实现的

2> GCD的API全部在libdispatch库中

3> GCD的底层实现主要有Dispatch Queue和Dispatch Source

l Dispatch Queue :管理block(操作)

l Dispatch Source :处理事件

7. 你用过NSOperationQueue么?如果用过或者了解的话,你为什么要使用NSOperationQueue,实现了什么?请描述它和GCD的区别和类似的地方(提示:可以从两者的实现机制和适用范围来描述)。

1> GCD是纯C语言的API,NSOperationQueue是基于GCD的OC版本封装

2> GCD只支持FIFO的队列,NSOperationQueue可以很方便地调整执行顺序、设置最大并发数量

3> NSOperationQueue可以在轻松在Operation间设置依赖关系,而GCD需要写很多的代码才能实现

4> NSOperationQueue支持KVO,可以监测operation是否正在执行(isExecuted)、是否结束(isFinished),是否取消(isCanceld)

5> GCD的执行速度比NSOperationQueue快

任务之间不太互相依赖:GCD

任务之间有依赖\或者要监听任务的执行情况:NSOperationQueue

8. 既然提到GCD,那么问一下在使用GCD以及block时要注意些什么?它们两是一回事儿么?block在ARC中和传统的MRC中的行为和用法有没有什么区别,需要注意些什么?

Block的使用注意:

1> block的内存管理

2> 防止循环retian

l 非ARC(MRC):__block

l ARC:__weak\__unsafe_unretained

9.在异步线程中下载很多图片,如果失败了,该如何处理?请结合RunLoop来谈谈解决方案.(提示:在异步线程中启动一个RunLoop重新发送网络请求,下载图片)

1> 重新下载图片

2> 下载完毕, 利用RunLoop的输入源回到主线程刷新UIImageVIUew

10. Socket的实现原理及Socket之间是如何通信的

11. http协议的实现

二、内存管理

1. 怎么保证多人开发进行内存泄露的检查.

1> 使用Analyze进行代码的静态分析

2> 为避免不必要的麻烦, 多人开发时尽量使用ARC

2.非自动内存管理情况下怎么做单例模式.

创建单例设计模式的基本步骤 ·

>声明一个单件对象的静态实例,并初始化为nil。

>创建一个类的类工厂方法,当且仅当这个类的实例为nil时生成一个该类的实例

>实现NScopying协议, 覆盖allocWithZone:方法,确保用户在直接分配和初始化对象时,不会产 生另一个对象。

>覆盖release、autorelease、retain、retainCount方法, 以此确保单例的状态。

>在多线程的环境中,注意使用@synchronized关键字或GCD,确保静态实例被正确的创建和初始化。

3.对于类方法(静态方法)默认是autorelease的。所有类方法都会这样吗?

1> 系统自带的绝大数类方法返回的对象,都是经过autorelease的

4.block在ARC中和MRC中的用法有什么区别,需要注意什么

1.对于没有引用外部变量的Block,无论在ARC还是非ARC下,类型都是__NSGlobalBlock__,这种类型的block可以理解成一种全局的block,不需要考虑作用域问题。同时,对他进行Copy或者Retain操作也是无效的

2.应注意避免循环引用

5.什么情况下会发生内存泄漏和内存溢出?

当程序在申请内存后,无法释放已申请的内存空间(例如一个对象或者变量使用完成后没有释放,这个对象一直占用着内存),一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。内存泄露会最终会导致内存溢出!

当程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个int,但给它存了long才能存下的数,那就是内存溢出。

6.[NSArray arrayWithobject:<id>] 这个方法添加对象后,需要对这个数组做释放操作吗?

不需要 这个对象被放到自动释放池中

7.Json数据的解析,和解析数据的时候有内存泄露吗?有的话 如何解

1> JSON解析的方案

l SBJson

l JSONkit

l NSJSONSerialization

2> 内存泄漏么?

8. 自动释放池底层怎么实现

自动释放池以栈的形式实现:当你创建一个新的自动释放池时,它将被添加到栈顶。当一个对象收到发送autorelease消息时,它被添加到当前线程的处于栈顶的自动释放池中,当自动释放池被回收时,它们从栈中被删除, 并且会给池子里面所有的对象都会做一次release操作.

三、Foundation

1. KVO内部实现原理

1> KVO是基于runtime机制实现的

2> 当某个类的对象第一次被观察时, 系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的 setter 方法。

派生类在被重写的 setter 方法实现真正的通知机制(Personà NSKVONotifying_Person)

2. 是否可以把比较耗时的操作放在NSNotificationCenter中

如果在异步线程发的通知,那么可以执行比较耗时的操作;

如果在主线程发的通知,那么就不可以执行比较耗时的操作

3.Foundation对象与Core Foundation对象有什么区别

1> Foundation对象是OC的,Core Foundation对象是C对象

2> 数据类型之间的转换

l ARC:__bridge_retained、__bridge_transfer

l 非ARC: __bridge

4.不用中间变量,用两种方法交换A和B的值

A = A + B

B = A - B

A = A - B

或者

A = A^B;

B = A^B;

A = A^B;

5.简单描述下对单利模式设计的理解?

节省内存资源,一个应用就一个对象。

6.什么是动态,举例说明

1> 在程序运行过程才执行的操作

7.runtime实现的机制是什么,怎么用,一般用于干嘛. 你还能记得你所使用的相关的头文件或者某些方法的名称吗?

运行时机制,runtime库里面包含了跟类、成员变量、方法相关的API,比如获取类里面的所有成员变量,为类动态添加成员变量,动态改变类的方法实现,为类动态添加新的方法等 需要导入<objc/message.h><objc/runtime.h>

1> runtime,运行时机制,它是一套C语言库

2> 实际上我们编写的所有OC代码,最终都是转成了runtime库的东西,比如类转成了runtime库里面的结构体等数据类型,方法转成了runtime库里面的C语言函数,平时调方法都是转成了objc_msgSend函数(所以说OC有个消息发送机制)

3> 因此,可以说runtime是OC的底层实现,是OC的幕后执行者

4> 有了runtime库,能做什么事情呢?runtime库里面包含了跟类、成员变量、方法相关的API,比如获取类里面的所有成员变量,为类动态添加成员变量,动态改变类的方法实现,为类动态添加新的方法等

5> 因此,有了runtime,想怎么改就怎么改

8.是否使用Core Text或者Core Image等?如果使用过,请谈谈你使用Core Text或者Core Image的体验。

CoreText

? 随意修改文本的样式

? 图文混排(纯C语言)

? 国外:Niumb

Core Image(滤镜处理)

* 能调节图片的各种属性(对比度, 色温, 色差等)

9.NSNotification和KVO的区别和用法是什么?什么时候应该使用通知,什么时候应该使用KVO,它们的实现上有什么区别吗?如果用protocol和delegate(或者delegate的Array)来实现类似的功能可能吗?如果可能,会有什么潜在的问题?如果不能,为什么?(虽然protocol和delegate这种东西面试已经面烂了…)

通知比较灵活(1个通知能被多个对象接收, 1个对象能接收多个通知),

代理比较规范,但是代码多(默认是1对1)

KVO性能不好(底层会动态产生新的类),只能监听某个对象属性的改变, 不推荐使用(1个对象的属性能被多个对象监听,  1个对象能监听多个对象的其他属性)

更详细参考:

http://blog.csdn.net/dqjyong/article/details/7685933

10.Block内部的实现原理

Objective-C是对C语言的扩展,block的实现是基于指针和函数指针

11. 有两个数组a,b,大小都为n,数组元素的值任意,无序;

要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小

算法题,要么靠功底,要么百度

四、数据存储

1. 如果后期需要增加数据库中的字段怎么实现,如果不使用CoreData呢?

编写SQL语句来操作原来表中的字段

1> 增加表字段

ALTER TABLE 表名 ADD COLUMN 字段名 字段类型;

2> 删除表字段

ALTER TABLE 表名 DROP COLUMN 字段名;

3> 修改表字段

ALTER TABLE 表名 RENAME COLUMN 旧字段名 TO 新字段名;

2. SQLite数据存储是怎么用?

1> 添加SQLite动态库:

2> 导入主头文件:#import <sqlite3.h>

3> 利用C语言函数创建\打开数据库,编写SQL语句

3. 简单描述下客户端的缓存机制?

1. 缓存可以分为:内存数据缓存、数据库缓存、文件缓存

2. 每次想获取数据的时候

1> 先检测内存中有无缓存

2> 再检测本地有无缓存(数据库\文件)

3> 最终发送网络请求

4> 将服务器返回的网络数据进行缓存(内存、数据库、文件), 以便下次读取

4. 你实现过多线程的Core Data么?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的哪些需要在线程中创建或者传递?你是用什么样的策略来实现的?

1> CoreData是对SQLite数据库的封装

2> CoreData中的NSManagedObjectContext在多线程中不安全

3> 如果想要多线程访问CoreData的话,最好的方法是一个线程一个NSManagedObjectContext

4> 每个NSManagedObjectContext对象实例都可以使用同一个NSPersistentStoreCoordinator实例,这是因为NSManagedObjectContext会在便用NSPersistentStoreCoordinator前上锁

5. core  data数据迁移

http://blog.csdn.net/jasonblog/article/details/17842535



版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-31 20:02:15

IOS-4-面试题1:黑马程序员IOS面试题大全的相关文章

黑马程序员——Java面试题之银行业务调度系统

                       android培训.java培训.期待与您交流!  对象分析: 1.客户类按照业务分类,客户可以分成三类. public enum Custommer { COMMON ,VIP , EXPRESS; public String toString(){ String name =null ; switch (this ){ case COMMON : name ="普通" ; break; case VIP : name ="VI

黑马程序员-入学笔试题

笔试结束,列一下笔试题和我的解答,最后得分29.7. 1. 编写一个类,在main方法中定义一个Map对象(采用泛型),加入若干个对象,然后遍历并打印出各元素的key和value. package com.itheima; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; public class Test1 { public static void m

黑马程序员---ios开发之,property指针在ios5中的一些说明

在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了,在此我也不介绍,网上有很多相关文章. 现在我们看看iOS5中新的关键字strong, weak, unsafe_unretained. 可以与以前的关键字对应学习strong与retain类似,weak与unsafe_unretained功能差不多(有点区别,等下会介绍,这两个新 关键字与assign类似).在iOS5中用这些新的关键字,就可以不用手动管理内存了,从java等其它语言转过来的程序

黑马程序员 ——ios点语法和类的三大特性

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); 一.点语法 (一)认识点语法

IOS-5-面试题2:黑马程序员IOS面试题大全

五.UI控件 1. 怎么解决缓存池满的问题(cell) ios中不存在缓存池满的情况,因为通常我们ios中开发,对象都是在需要的时候才会创建,有种常用的说话叫做懒加载,还有在UITableView中一般只会创建刚开始出现在屏幕中的cell,之后都是从缓存池里取,不会在创建新对象.缓存池里最多也就一两个对象,缓存池满的这种情况一般在开发java中比较常见,java中一般把最近最少使用的对象先释放. 2. CAAnimation的层级结构 3. UIButton与UITableView的层级结构 1

黑马程序员---ios学习日志10

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 程序的结构及分类 程序的结构有三种分别为: 1.顺序结构:一种简单的程序结构,他有若干个依次执行的处理步骤组成. 程序流程  语句1-- 语句2-- 语句3-- .... 2.分支结构:程序遇到一些条件判断,流程根据条件是否成立由不同的流

黑马程序员--IOS学习笔记--数组及排序

IOS学习笔记 概述: 8_2.改变整型变量的符号 8_2.改变整型变量所占存储空间 8_3.char类型数据存储 8_4.数组的基本概念及分类 8_5.数组元素作为函数参数 8_5.一维数组定义及注意事项 8_6.一维数组初始化 8_7.一维数组一个让人疑惑的问题 8_8.一维数组的引用 8_9.应用:数组遍历 8_10.一维数组的存储方式 8_11.一维数组的地址 8_12.一维数组长度计算方法 8_13.一维数组的越界问题 8_14.应用:找最大值 8_15.数组元素作为函数参数 8_16

黑马程序员 IOS基础第二天 printf, scanf

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 32个关键字 A数据类型  5 void char int float double B 不同常量的表示法--重点 ‘’'' 数据类型---流程控制 标示符--驼峰命名法 首字符小写,其他大写 单行注释// 多行注释/**/ 常见数据类型:int  4 float 4 double 8 char   1字节 常量的定义,计算机中存储固定不变的,整形,实行,字符,字符串 掌握变了的定义 变了代表

黑马程序员-ios学习-C语言入门篇-非MAC下编译C的环境,算法的理解-01

很高兴写第一篇技术博客!2011年以后就没在写过博客这东东了!好了,废话扯两句!以下正文 ios开发课程有c语言,那么,我们当前没有购买mac电脑,那我们出了装虚拟机,就用windows跟linux来练习c语言吧,可以缓冲几天,可以做基础测试的时候,可以用到! vc++6.0安装,百度搜索,vc++6.0,然后下载下来,安装,就这么简单!我在我虚拟机里面安装安装一下吧! 点击setup.exe,弹出一个程序兼容的提示框,别理会,点击运行,反正遇到下一步,就点,遇到继续就点,就好了,安装软件简单,