iOS 面试题之多线程是什么?

面试官:你给我讲讲多线程吧。

我:多线程,就是多线程呗。。。

要是都这么回答,还有多少人要你。

=====================================================

首先分析多线程的使用环境:

多线程处理包括Core Data的多线程访问,UI的并行绘制,异步网络请求以及一些在运行态内存吃紧的情况下处理大文件的方案等。

其次,分别举例说明iOS提供的多线程的实现方法

iOS中提供了以下集中中多线程的实现方式

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 = 0 ;
    
    for (int i = 0 ; i < 600000000; 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:2];
    
    [queue addOperation:op1];
    [queue addOperation:op2];
    [queue addOperation:op3];
    [queue addOperation:op4];
    
    // 优点:能够自己管理 线程安全 能够合理的安排线程 降低系统的开销 提高对线程的利用率
    // 缺点:可读性差 写起来比较繁琐

5.GCD

    // GCD 是基于队列的 多线程实现方式
    // 队列的类型
    // 1.并行: 多个任务同时执行 Concurrent
    // 2.串行: 依次执行任务(同一事件只执行一个任务) Serial
    
    // 自己创建一个队列
    // 参数1:给队列起个名字
    // 参数2:选择队列的类型 DISPATCH_QUEUE_CONCURRENT(串行) 
    dispatch_queue_attr_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);
    
    // 使用队列
    // 参数1: 在哪个队列执行代码
    // 参数2: 要执行的代码
    dispatch_async(queue, ^{
        [self btnUpClicked:nil];
    });

高级用法:

    // 系统定义了5个队列
    // 1. 一个串行队列  主队列作用 : 管理主线程的相关事务
    
    // 获得主队列
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    // 在主队列执行任务
//    dispatch_async(mainQueue, ^{
//        [self btnUpClicked:nil];
//    });
    
    
    // 2. 4个并行队列 (并行队列)
    // 参数1: 选择队列的优先级
    // 参数2: 给未来使用 一般填0
    dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//    dispatch_async(globalQueue, ^{
//        [self btnUpClicked:nil];
//    });
    
    // 高端使用
    // 1.全局队列获取数据 回到主队列将数据加载到视图上
//    dispatch_async(globalQueue, ^{
//       
//        // 全局队列(子线程)获取数据
//        NSString *str = @"htt://www.baidu.com";
//        NSURL *url = [NSURL URLWithString:str];
//        
//        NSData *data = [NSData dataWithContentsOfURL:url];
//        UIImage *image = [UIImage imageWithData:data];
//        
//        // 返回主线程 加载UI/更新UI
//        dispatch_async(mainQueue, ^{
//           
//            UIImageView *imageView = [[UIImageView alloc] init];
//            // 给视图赋值
//            imageView.image = image;
//            
//        });
//    });
    
    // 2.一段代码只执行依次
    // 大部分的时候 都在单例方法中使用
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSLog(@"只执行依次");
    });
    
    // 3.一段代码执行多次 (全局队列有效)
    // 参数1: 执行多少次
    // 参数2: 在哪个队列有效
    // 参数3: 要执行的内容
    dispatch_apply(4, globalQueue, ^(size_t a) {
        NSLog(@"%zu", a);
    });
    
    // 4.定时
    // 参数1: 间隔几秒
    // 参数2: 执行的内容
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"=====");
    });

强烈建议用GCD去吓唬人。这可不是我说的,是他们总结的,反正好用就是个,尤其是遇到面试官不是iOS开发的。。。左拉有扯地拉他回GCD。一句话GCD万岁~

iOS 面试题之多线程是什么?

时间: 2024-10-10 01:07:24

iOS 面试题之多线程是什么?的相关文章

IOS面试题之--多线程

1 多线程是什么 多线程是个复杂的概念,按字面意思是同步完成多项任务,提高了资源的使用效率,从硬件.操作系统.应用软件不同的角度去看,多线程被赋予不同的内涵,对于硬件,现在市面上多数的CPU都是多核的,多核的CPU运算多线程更为出色:从操作系统角度,是多任务,现在用的主流操作系统都是多任务的,可以一边听歌.一边写博客:对于应用来说,多线程可以让应用有更快的回应,可以在网络下载时,同时响应用户的触摸操作.在iOS应用中,对多线程最初的理解,就是并发,它的含义是原来先做烧水,再摘菜,再炒菜的工作,会

最全的iOS面试题及答案-转载

1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承:可以实现多个接口,通过实现多个接口可以完成C++的多重继承:Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系. 2. #import 跟#include 又什么区别,@class呢, #import<> 跟 #import””又什么区别?

iOS 面试题:OC基本概念题

1.什么是类和对象? 类是一组具有同样特征和功能的事物的抽象 对象描写叙述了一个物体的特征和行为实现 类是对象的抽象 对象是类的实例 2.OC中定义类,创建对象,使用对象. OC中定义类分为接口部分,实现部分 接口部分:对外声明类的特征和行为 实现部分:实现方法,即类的行为实现 创建对象须要进行分配内存空间和初始 3.声明方法,依据需求.区分:方法声明,方法实现,方法运行 4.继承.继承的全部特点 子类能够继承父类全部的声明的方法和除私有的以外实例变量 父类不能使用子类所创建的方法和实例变量 5

ios面试题汇总

1.Difference between shallow copy and deep copy??浅复制和深复制的区别??答案:浅层复制:只复制指向对象的指针,而不复制引用对象本身.?深层复制:复制引用对象本身.?意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源?还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想.深复制就好

史上最全的iOS面试题及答案

1.写一个NSString类的实现 + (id)initWithCString:(c*****t char *)nullTerminatedCString encoding:(NSStringEncoding)encoding; + (id) stringWithCString: (c*****t char*)nullTerminatedCString encoding: (NSStringEncoding)encoding { NSString  *obj; obj = [self alloc

《招一个靠谱的移动开发》iOS面试题及详解(上篇)

多线程.特别是NSOperation 和 GCD 的内部原理. 运行时机制的原理和运用场景. SDWebImage的原理.实现机制.如何解决TableView卡的问题. block和代理的,通知的区别.block的用法需要注意些什么. strong,weak,retain,assign,copy nomatic 等的区别. 设计模式,mvc,单利,工厂,代理等的应用场景. 单利的写法.在单利中创建数组应该注意些什么. NSString 的时候用copy和strong的区别. 响应值链. NSTi

[转载]iOS面试题总

转载自:http://blog.sina.com.cn/s/blog_67eb608b0101r6xb.html (2014-06-13 20:23:33) 转载▼ 标签: 转载   crash 原文地址:iOS面试题总作者:唯一的弟子 1.简述OC中内存管理机制.与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonato

iOS面试题系列之Objective-C相关

1.简述你项目中常用的设计模式.它们有什么优缺点? 常用的设计模式有:代理.观察者.单例. (1)单例:它是用来限制一个类只能创建一个对象.这个对象中的属性可以存储全局共享的数据.所有的类都能访问.设置此单例中的属性数据. 优点:是它只会创建一个对象容易供外界访问,节约性能. 缺点:是一个类只有一个对象,可能造成责任过重,在一定程度上违背了"单一职责原则".单例模式中没有抽象层,所以单例类的扩展有很大的困难.不能过多创建单例,因为单例从创建到程序关闭前会一直存在,过多的单例会影响性能,

超全!iOS 面试题汇总

超全!iOS 面试题汇总 2015-10-20 CocoaChina 作者:Job_Yang 之前看了很多面试题,感觉要不是不够就是过于冗余,于是我将网上的一些面试题进行了删减和重排,现在分享给大家.(题目来源于网络,侵删) 1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好