1.面试题方向:

1>.多线程+网络

2>.项目(简历上的项目,每一个细节:技术实现细节、业务、项目周期、人数)

3>.性能优化:图片优化、内存优化(tableView的循环利用)

4>.常见的小操作:发布程序、真机调试、推送

5>.OC:内存管理(重点,ARC与非ARC区别)、语法细节、偏僻的语法

2.面试题

1.多线程的底层实现?

答:1>回答可以从”多线程“是从哪个系统中开始使用:Mach是第一个以多线程方式处理任务的系统,

因此多线程的底层实现的底层机制是基于Mach的线程

2.>回答多线程的使用环境:多线程处理包括Core Data的多线程访问,UI的并行绘制,异步网络请求

以及在运行态内存吃紧的情况下处理大文件的方案等

3>回答并且举例说明iOS提供的多线程的实现方法:iOS中提供了以下几种处理多线程的实现方式

1.回答C语言中的POSIX接口,通过导入库#include <pthread.h>

2.多线程使用方法

1>.NSOBjcet实现

// 最简单的多线程 执行方式
// 参数1:需要在后台(子线程)执行方法
// 参数2:给这个方法传参
[self performSelectorInBackground:@selector(btnUpClicked:)withObject:nil];

2>NSThread实现

// 优点:在所有的多线程实现方式中  最轻量级
// 可以按照需求 任意控制thread对象 即:线程的加锁等操作
// 缺点:控制太繁琐 不能自己控制线程安全
// NSThread 的一个对象 就代表一个线程
NSThread *thread = [[NSThread alloc]initWithTarget:selfselector:@selector(btnUpClicked:)object:nil];
[thread start];
[thread release];
3>NSOperation实现
// NSOperation代表一个任务 自己不能实现多线程
// NSOperation是一个抽象类 不能直接使用 需要创建一个子类去编写实现的内容
// 任务开始 会在当前线程执行任务(main方法中的代码) MyOperation *operation = [[MyOperation alloc] init];
[operation start];
[operation release]; // 系统已经写好了两个类 可以直接使用
// NSInvocationOperation *invocation = [[NSInvocationOperation alloc] initWithTarget:<#(id)#> selector:<#(SEL)#> object:<#(id)#>]
NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{
// 填写你要执行的任务内容
}];
@implementation MyOperation

- (void)main
{
// operation在main方法中写要执行的任务 static int count = ; for (int i = ; i < ; i ++) {
count ++;
}
NSLog(@"%d", count); // 判断当前任务是否为主线程 0为不是 1为是
BOOL b = [NSThread isMainThread];
NSLog(@"%d", b); NSThread *thread = [NSThread currentThread];
NSLog(@"当前线程为:%@", thread); }
@end

4>NSOperationQueue

 // 任务队列(NSOperationQueue) 内部管理一些列的线程

    MyOperation *op1 = [[MyOperation alloc] init];
MyOperation *op2 = [[MyOperation alloc] init];
MyOperation *op3 = [[MyOperation alloc] init];
MyOperation *op4 = [[MyOperation alloc] init]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; // 设置最大并发数
[queue setMaxConcurrentOperationCount:]; [queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:op3];
[queue addOperation:op4]; // 优点:能够自己管理 线程安全 能够合理的安排线程 降低系统的开销 提高对线程的利用率
// 缺点:可读性差 写起来比较繁琐

5>GCD

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,) ,^{
//下载图片
dispatch_async(dispatch_get_main_queue(),^{
//回到主线程
});
});

 2.线程是如何通信的?

1>回答线程通信:一条线程回到另外一条线程(一个线程数据传输到另外一条线程 )

2>线程通信第一种方法(performSelector,performSelectorOnMainThread)

3>.线程通信第二种方法(NSMarchPort)

主线程可以通过NSMarchPort输入给子线程NSMarchPort,反之亦可

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

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

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

回答:

//创建队列
NSOperationQueue *queue = [[NSOperation alloc] init]; //创建3个操作
NSOperation *a = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"operation--a"); }];
NSOperation *b = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"operation--b"); }];
NSOperation *c = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"operation--c"); }];
//添加依赖
[c addDependency:a];
[c addDependency:b]; //执行操作
[queue addOperation:a];
[queue addOperation:b];

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

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

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

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

6.GCD内部怎么实现?

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

2>GCD的API全部在libdispatch库中

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

   ~ Dispatch Queue :管理block(操作)

    ~Dispatch Source:处理事件(比如线程通信)

      GCD的block存放在队列:底层实现主要存在队列

7.你用过NSOperationQueue ?如果用过或者了解的话,你为什么要用NSOperationQueue实现了什么?

请描述它和GCD的区别和类似的地方?

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

     2>GCD只支持FIFO(先进先出)的队列,NSOperationQueue可以很方便地调整执行顺序(可以添加依赖顺序执行)设置最大并发数量

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

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

     @1.KVC:间接通过字符串类型的key取出对应的属性值

   KVC的价值:

   #1.可以访问私有成员变量的值

   #2.可以间接修改私有成员变量的值(替换系统自带的导航栏、tabbar)

#3.KVC valueForKey与valueForKeyPath区别:

   ^1.valueForKey:只能访问当前对象的属性

   ^2.valueForKeyPath:能利用,运算符一层一层往内部访问属性

5>GCD的执行速度比NSOperationQueue快

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

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

8.提到GCD,那么 问一下在使用GCD以及block时要注意一些什么?他们两是一回事么?

block在ARC中和传统的MRC中行为和用法有没有什么区别,需要注意一些什么?

回答:Block使用注意:

  1>block的内存管理

  

  block进行copy操作后(堆空间对所引用的对象产生一个强引用,对p对象产生一个强引用,就会造成循环引用):

附:block只要不进行copy操作,block内存永远在栈内存当中,就不会对所引用对象产生强引用

block存储于堆空间,就会对block内部所用到的对象产生强引用

block 进行weak操作后(弱指针引用)

附:ARC如果block进行copy防止内存泄露可以使用 __unsafe_unretained typeof(对象)释放内存,解决循环引用

  非ARC可以使用__block typeof(p) 解决循环引用

变量前添加__block,传入地址

  2>防止循环retain

  @非ARC(MRC):_block

  @ARC:_weak/__unsafe_unretained

block进行copy操作后,对象在,block就存在,

9.在异步线程中下载很多图片,如果失败了,该如何处理?请结合RunLoop重新发送网络请求

回答:1>重新下载图片

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

iOS面试题01-多线程网络的更多相关文章

  1. [置顶] 阿里IOS面试题之多线程选用NSOperation or GCD

    今天早上接到了阿里从杭州打过来的电话面试.虽然近期面试了一些大中型的互联网企业,但是跟素有“IT界的黄浦军校”的阿里面试官接触还是不免紧张. 面试持续了三四十分钟吧,大部分问题都是简历上的项目经验而来 ...

  2. AJ学IOS(49)多线程网络之线程的创建NSThreand

    AJ分享,必须精品 一:NSThread的基本使用 1:创建和启动线程 一个NSThread对象就代表一条线程 创建.启动线程 NSThread *thread = [[NSThread alloc] ...

  3. AJ学IOS(48)多线程网络之多线程简单了解

    AJ分享,必须精品 一:进程和线程 1:什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开QQ.Xcode,系统就会分 ...

  4. iOS面试题01

    1.#import和#include.@class有什么区别?#import<>和#import“”又有什么区别? 答:1.#import和#include都能完整地包含某个文件的内容,# ...

  5. AJ学IOS(55)多线程网络之图片下载框架之SDWebImage

    AJ分享,必须精品 效果: 代码: - (NSArray *)apps { if (!_apps) { NSArray *dictArray = [NSArray arrayWithContentsO ...

  6. AJ学IOS(54)多线程网络之NSOperation重要知识

    AJ分享,必须精品 一:队列的类型与队列添加任务 1: 主队列 [NSOperationQueue mainQueue] 添加到”主队列”中的操作,都会放到主线程中执行. 2:非主队列 [[NSOpe ...

  7. AJ学IOS(53)多线程网络之NSOperation简介

    AJ分享,必须精品 一:简单介绍 1:NSOperation的作⽤使用步骤: 配合使用NSOperation和NSOperationQueue也能实现多线程编程. NSOperation和NSOper ...

  8. AJ学IOS(50)多线程网络之GCD简单介绍(任务,队列)

    AJ分享,必须精品 GCD简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果 ...

  9. iOS笔试题01

    1. #import 跟#include.@class有什么区别?#import<> 跟 #import”"又什么区别? 1> #import和#include都能完整地包 ...

随机推荐

  1. J2SE知识点摘记(二十三)

    我们简单介绍一下这个接口: 1.4.3        Comparable 接口 在 java.lang 包中,Comparable 接口适用于一个类有自然顺序的时候.假定对象集合是同一类型,该接口允 ...

  2. Qt通过Http上传文件(路过)

    web端: <?php $c = $GLOBALS['HTTP_RAW_POST_DATA']; $n = $_GET["filename"]; $fp = fopen($n ...

  3. 剑指offer 25 二叉树中和为某一值的路径

    非递归方法: class Solution { public: vector<vector<int>> FindPath(TreeNode* root,int expectNu ...

  4. android样式布局---&gt;ListView(附上源代码)

    在android应用开发过程中,Listview 是经常使用的数据展现控件,往往用于显示列表形式的数据. 假设只显示数据往往会显得非常单调.非常多时候依据须要定义不同的item 背景选项.比如定义数据 ...

  5. jstack命令使用

    概述 jstack可用于导出java运用程序的线程堆栈.其基本使用语法为: jstack [-l] pid -l 选项用于打印锁的额外信息. 使用演示样例 以下这段代码执行之后会出现死锁现象(由于线程 ...

  6. delphi “Invalid floating point operation.”错误的解决方法

    这两天用webbrower写东西,有时候打开SSL加密站点时会出现”Invalid floating point operation.”的错误,上网搜了下,把解决方法贴上. 导致原因 在Delphi2 ...

  7. android可拖动排序GridView实现

    经常使用今日头条.网易新闻的同学们应该都会注意到用于管理多个频道的可拖动排序GridView,下面介绍一下可拖动的DragGridView的实现方法.代码放在GitHub上https://github ...

  8. CentOS配置ftp服务器

    1.首先更新yum 源 yum update 2. 安装vsftpd yum install vsftpd -y   // 安装    移除是 yum remove vsftpd 3. 配置Vsftp ...

  9. IOS开发-UIView之动画效果的实现方法(合集)

    http://www.cnblogs.com/GarveyCalvin/p/4193963.html 前言:在开发APP中,我们会经常使用到动画效果.使用动画可以让我们的APP更酷更炫,最重要的是优化 ...

  10. prime算法求最小生成树(畅通工程再续)

    连着做了四道畅通工程的题,其实都是一个套路,转化为可以求最小生成树的形式求最小生成树即可 这道题需要注意: 1:因为满足路的长度在10到1000之间才能建路,所以不满足条件的路径长度可以初始化为无穷 ...