美文网首页
ios面试的一些整理

ios面试的一些整理

作者: 快乐的tomato | 来源:发表于2017-06-21 16:21 被阅读40次

    近期因为考驾照,没事再看一些面试题,顺便再把基础复习复习,在其他方也看了一些面试题,整理出来,以方便日后再看。有一些是别人的总结,写的挺好,就拿过来参考一下。

    初级:

    1.为什么说OC是动态语言?体现在哪些地方?
    • 动态类型:即数据类型的确定由编译时,推迟到了运行时,就是在运行的时候才对象的类型。
    • 动态绑定:在某个实例对象被确定后,其类型便被确定了,该对象对应的属性和方法就确定了。
    • 动态加载:比如加载图片的时候,有2X,3X的图片,当设备更换的时候,图片也进行更换。
      详解
    补充:编译和运行的区别:
    • 编译:包括编译和链接2个部分。编译就是把源代码转换成机器可识别的二进制语言(针对的是单个文件),链接是编译生成的二进制文件,组合成为一个系统可以执行的可执行文件。
    • 运行:把编译出来的可执行文件,在系统中运行的过程。
      打个比方,编译就是做饭的过程,运行就是吃饭。
    2.讲一下MVC、MVVM和MVP?
    MVC

    MVC是一种设计模式,M(model)模型,V(view)视图,C(controller)控制器。
    他们分工明确有相互合作。
    工作原理:
    首先视图接受用户的输入请求,然后将请求传递给控制器,控制器再调用相应的模型来处理用户的请求,将处理后的模型显示在视图上。
    优点:
    实现了功能模块和视图模块的分离
    同时提高了系统的可维护性、可扩展性和组件的可复用性,
    一个模型可以同时用于多个视图,使关联的视图数据同时更新。
    缺点:
    增加了系统结构的复杂性和实现的复杂性。
    降低了系统的性能,因为视图不能直接访问数据,中间隔了一个控制层。

    MVVC、MVP

    关于设计模式,下面的文章讲的不错,但是我还是不是很懂MVP和MVVM,这2种模式没有用过。
    杂谈: MVC/MVP/MVVM

    3.为什么代理要用weak?为什么IBOutlet修饰的UIView也适用weak关键字?
    补充:

    strong 强指针 weak 弱指针
    在ARC中,只要对象没有强指针就会自动释放。
    代理的属性一般用weak修饰,一、为了避免循环引用 二、当使用weak修饰的属性,当对象释放的时候,系统会对属性赋值nil,object-c有个特性就是对nil对象发送消息也就是调用方法,不会crash。例如ScrollerView:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
    
        UIScrollView *sl = [[UIScrollView alloc] init];
        sl.delegate = self;
        [self.view addSubview:sl];
    }
    

    画图解释


    image.png
    @property (nonatomic , weak) UISwitch *sw;
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
    
        UISwitch *sw = [[UISwitch alloc] init];
      
        [self.view addSubview:sl];
       self.sw = sw
    }
    
    image.png
    由此可知UIview用weak和strong都可以,但是官方建议使用weak。
    详细答案
    4.代理的delegate和dataSource有什么区别?

    delegate: 表示代理,代理可以让A对象通知B对象,我(A)发生的变化,前提B遵循了A的代理,并且实现了A的代理方法。
    dataSource: 表示数据源,如果A对象声明了数据源,当我们创建A对象的时候,我们就该实现数据源,来告诉A,他所需要的一些数据。例如:tableView数据源方法,需要告诉它,我要实现几组cell,每组cell多少行cell,实现的cell什么样式,什么内容
    同样delegate和 dataSource,都是可以使用require和optional来修饰的。
    UITableView的数据源(dataSource)和代理(delegate)详解

    5.block和代理的区别?

    相同点:代理和Block大多是我们都可以用来做倒序传值的。我们都得注意避免循环引用。
    不同点:代理使用weak修饰,代理必须先声明方法。当我们调用代理的时候要判断是否已经实现。
    block:使用的是copy来修饰,block保存的是一段代码,其实也就是一个函数。当我们调用block的时候要判断是否已经实现。
    详细答案

    6.属性的实质是什么?包括哪几个部分?属性默认的关键字都有哪些?@dynamic关键字和@synthesize关键字是用来做什么的?
    • 6.1 实质
      属性是描述类的特征,也就是具备什么特性。
      三个部分,带下划线的成员变量,get、setter方法。
      默认关键字:readwrite,assign, atomic;详细说明

    • 6.2 dynamic和synthesize
      @dynamic :修饰的属性,其getter和setter方法编译器是不会自动帮你生成。必须自己是实现的。
      @synthesize:修饰的属性,其getter和setter方法编译器是会自动帮你生成。不必自己实现,可以指定与属性相对应的成员变量。 6.3和6.4的答案

    7.NSString为什么要用copy关键字,如果用strong会有什么问题?(注意:这里没有说用strong就一定不行。使用copy和strong是看情况而定的)?如何令自己所写的对象具有拷贝功能?

    众所周知,我们知道,可变类型(NSMutableArray,NSMutableString等)是不可边类型(NSString,NSArray等)的子类,因为多态的原因,我们可以使用赋值指向子类对象,也就是我们可以使用不可边类型去接受可变类型。
    1.当我们使用strong修饰A不可边类型的时候,并且使用B可变类型给A赋值,再去修改可变类型B值的时候,A所指向的值也会发生改变。引文strong只是让创建的对象引用计数器+1,并返回当前对象的内容地址,当我们修改B指向的内容的时候,A指向的内容也同样发生了改变,因为他们指向的内存地址是相同的,是一份内容。
    2.当我们使用copy修饰A不可边类型的时候,并且使用B可变类型给A赋值,再去修改可变类型B值的时候,A所指向的值不会发生改变。因为当时用copy的修饰的时候,会拷贝一份内容出来,并且返回指针给A,当我们修改B指向的内容的时候,A指向的内容是没有发生改变的。因为A指向的内存地址和B指向的内存地址是不相同的,是两份内容。

    3.copy修饰不可边类型(NSString,NSArray等)的时候,表示浅拷贝,只拷贝一份指针,和strong修饰一样,当修饰的是可变类型(NSMutableArray,NSMutableString等)的时候,表示深拷贝,直接拷贝新一份内容,到内存中。表示两份内容。
    答案

    8、可变集合类 和 不可变集合类的 copy 和 mutablecopy有什么区别?如果是集合是内容复制的话,集合里面的元素也是内容复制么?

    iOS 图文并茂的带你了解深拷贝与浅拷贝
    可变数组和不可变数组之间的转换
    1、不管是NSArray 还是NSMutableArray,使用copy产生的都是不可变的。
    2、不管是NSArray 还是NSMutableArray,使用MutableCopy产生的都是可变的。
    3、NSArray使用copy方法不会产生新的对象,其他的都会产生新的对象。

    9、nonatomic和atomic的区别?atomic是绝对的线程安全么?为什么?如果不是,那应该如何实现?

    nonatomic:表示非原子,不安全,但是效率高。
    atomic:表示原子行,安全,但是效率低。
    atomic:不能绝对保证线程的安全,当多线程同时访问的时候,会造成线程不安全。可以使用线程锁来保证线程的安全。
    答案

    10、UICollectionView自定义layout如何实现?

    实现一个自定义layout的常规做法是继承UICollectionViewLayout类,然后重载下列方法:

    -(CGSize)collectionViewContentSize
    返回collectionView的内容的尺寸
    -(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
    返回rect中的所有的元素的布局属性
    返回的是包含UICollectionViewLayoutAttributes的NSArray
    UICollectionViewLayoutAttributes可以是cell,追加视图或装饰视    图的信息,通过不同的UICollectionViewLayoutAttributes初始化方法可以得到不同类型的UICollectionViewLayoutAttributes:
       layoutAttributesForCellWithIndexPath:
       layoutAttributesForSupplementaryViewOfKind:withIndexPath:
    layoutAttributesForDecorationViewOfKind:withIndexPath:
      -(UICollectionViewLayoutAttributes )layoutAttributesForItemAtIndexPath:(NSIndexPath )indexPath
    返回对应于indexPath的位置的cell的布局属性
    -(UICollectionViewLayoutAttributes )layoutAttributesForSupplementaryViewOfKind:(NSString )kind atIndexPath:(NSIndexPath *)indexPath
    返回对应于indexPath的位置的追加视图的布局属性,如果没有追加视图可不重载
    -(UICollectionViewLayoutAttributes * )layoutAttributesForDecorationViewOfKind:(NSString)decorationViewKind atIndexPath:(NSIndexPath )indexPath
    返回对应于indexPath的位置的装饰视图的布局属性,如果没有装饰视图可不重载
    -(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
    当边界发生改变时,是否应该刷新布局。如果YES则在边界变化(一般是scroll到其他地方)时,将重新计算需要的布局信息。
    
    12、用StoryBoard开发界面有什么弊端?如何避免?

    使用简单逻辑页面的跳转是可以使用sb的,开发比较块。
    但是SB对于逻辑项目比较复杂的时候,开发起来比较慢。不适合多人合作开发;也不利于版本的梗系和后期的维护。使用sb在项目变异编译的时候,也都会直接加载到内存中,造成内存的浪费。
    可以使用xib来代替,编辑复杂逻辑界面时候可以使用纯码编写。

    13、进程和线程的区别?同步异步的区别?并行和并发的区别?

    线程间通信?
    进程:是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
    线程:是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
    同步:只在同一个线程内部执行任务。
    异步:可以开辟线程来执行任务。
    并发:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。
    并行:当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。
    区别:并发和并行是即相似又有区别的两个概念,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。在多道程序环境下,并发性是指在一段时间内宏观上有多个程序在同时运行,但在单处理机系统中,每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。倘若在计算机系统中有多个处理机,则这些可以并发执行的程序便可被分配到多个处理机上,实现并行执行,即利用每个处理机来处理一个可并发执行的程序,这样,多个程序便可以同时执行。

    14、线程间通信?

    当使用dispath-async函数开辟线程执行任务的完成时,我们需要使用dispatch_async(dispatch_get_main_queue(), ^{ });函数会到主线程内刷新UI。并完成通信

    15、GCD的一些常用的函数?(group,barrier,信号量,线程同步)

    GCD
    答案

    16、数据持久化的几个方案(fmdb用没用过)

    答案

    12、说一下AppDelegate的几个方法?从后台到前台调用了哪些方法?第一次启动调用了哪些方法?从前台到后台调用了哪些方法?

    答案

    13、NSCache优于NSDictionary的几点?

    什么是NSCache
    优点

    14、知不知道Designated Initializer?使用它的时候有什么需要注意的问题?

    Designated Initializer

    15、实现description方法能取到什么效果?

    答案

    中级

    Block

    1、block的实质是什么?一共有几种block?都是什么情况下生成的?

    实质
    block种类

    2、为什么在默认情况下无法修改被block捕获的变量? __block都做了什么?

    当定义block的时候,block会把外部的变量以const的方式复制一份存放到block所在的内存中。
    答案解释

    3、模拟一下循环引用的一个情况?block实现界面反向传值如何实现?

    强指针和弱指针的区别
    强引用会持有对象,而弱引用不持有对象

    Paste_Image.png

    循环引用的情况一:


    Paste_Image.png

    上面代码运行完之后都不会释放内存,因为都是属性都是strong,构成了循环引用。画图解释:


    Paste_Image.png
    代码结束后,
    Paste_Image.png

    解决办法,将其中的一个属性改为weak.
    循环引用的情况二(UIView的weak)、

    Paste_Image.png Paste_Image.png

    循环引用的情况三(delegate的weak)、

    Paste_Image.png Paste_Image.png

    循环引用的情况四(block)、


    Paste_Image.png Paste_Image.png

    block实现界面反向传值
    逆向传值

    Runtime

    1、objc在向一个对象发送消息时,发生了什么?

    http://www.jianshu.com/p/19f280afcb24

    2、什么时候会报unrecognized selector错误?iOS有哪些机制来避免走到这一步?
    3、能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量?为什么?
    4、runtime如何实现weak变量的自动置nil?
    5、给类添加一个属性后,在类结构体里哪些元素会发生变化?

    相关文章

      网友评论

          本文标题:ios面试的一些整理

          本文链接:https://www.haomeiwen.com/subject/kuvgqxtx.html