一、多线程网络

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方法, 以此确保单例的状态。

>在多线程的环境中,注意使用@synchronizedkeyword或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. 简单描写叙述下client的缓存机制?

1. 缓存能够分为:内存数据缓存、数据库缓存、文件缓存

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

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

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

3> 终于发送网络请求

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

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



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

  1. 黑马程序猿_7K面试题之交通灯系统

    交通灯信号模拟系统 一.概述 模拟实现十字路口的交通灯管理系统逻辑,详细需求例如以下:(需求直接来源于老师的文档) ①      异步随机生成依照各个路线行驶的车辆. 比如: 由南向而来去往北向的车辆 ...

  2. 黑马程序猿————Java基础日常笔记---反射与正則表達式

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...

  3. 黑马程序猿——25,打印流,合并流,对象序列化,管道流,RandomAccessFile

    ------<ahref="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培 ...

  4. 黑马程序猿——15,String,StringBuffer,基本数据类型包装对象

    ------<ahref="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培 ...

  5. 黑马程序猿_Java 代理机制学习总结

    -------<a href="http://www.itheima.com/"">android培训</a>.<a href=" ...

  6. 黑马程序猿——Java中的类载入器

    ------- android培训.java培训.期待与您交流! -------- 类载入器 Java虚拟机中能够安装多个类载入器,系统默认三个主要类载入器,每一个类负责载入特定位置的类: BootS ...

  7. 黑马程序猿_try-catch-finally

    ------- android培训.java培训.期待与您交流! ---------- try-catch-finally中怎样定义语句呢? 1.try块中主要定义可能出现的异常处理语句 2.catc ...

  8. 黑马程序猿 IO流 ByteArrayInputStream与ByteArrayOutputStream

    ---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- package cn.itcast.IO; i ...

  9. 黑马程序猿————OC在Foundation框架结构和字符串

    ------<a href="http://www.itheima.com" target="blank">Java火车.Android火车.iOS ...

随机推荐

  1. Linux(ubuntu)下手动安装 firefox 6 并且添加快捷方式图标

    Mozilla 正式发布了Firefox 6,如果你的电脑上还在用非常古老的版本么,赶紧过来更新下吧,由于官网上面只是提供了linux下的.bz2的压缩包,没有deb或者rmp格式,所以需要自己安装下 ...

  2. Linux 一个sysv 脚本参考模板

    说明:  1.很多时候我们的服务都是通过源码包编译安装,但是有的源码包编译完成后并不提供该服务的sysv风格脚本,我们只能手动执其二进制程序+配置文件      2.如果服务器宕机或重启,就不能自动完 ...

  3. vuex 表单字段映射工具 vuex-map-fields

    vuex在处理表单的时候显得很麻烦,要一个字段一个字段的去写set和get还有mutation,字段多的话带来的工作量将是非常巨大的.vuex-map-fields将能很好的解决这个问题. vuex- ...

  4. linux挂载新磁盘、分区和开机自动挂载

    今天在阿里云虚拟主机里新加了一块磁盘,需要单独挂载到centos7. 挂载过程中遇到了不少问题,记录如下: 查看分区 fdisk -l 其中第一个框和第二个框,是已经分好区的磁盘,第三个硬盘没有分区. ...

  5. Longest Increasing Subsequence - LeetCode

    Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...

  6. Difference between a Hard Link and Soft (Symbolic) Link

    Within the Unix/Linux file system, linking lets you create file shortcuts to link one or more files. ...

  7. 【redis】存入redis的值,如果为null是否默认不被存入

    存入redis的值,如果为null是否默认不被存入

  8. Android开发初期之后怎么提升?怎么才能叫精通?方向在哪?

    hi大头鬼hi Android开发专家     先mark一下,好多人我发现始终停留在两三年的水平上没有突破. 另外还有一个误区就是越底层越牛逼 第三个就是,我认识的大部分所谓的做过rom开发的对fr ...

  9. Failed to fetch URL http://dl-ssl.google.com/android/repository/repository.xml, reason:

    Failed to fetch URL http://dl-ssl.google.com/android/repository/repository.xml, reason: Connection t ...

  10. Flutter开发记录part1

    (1)AppBar:automaticallyImplyLeading//是否带返回leading箭头 (2)非route路由页面跳转 :Navigator.of(context).push(Mate ...