zoukankan      html  css  js  c++  java
  • iOS面试总结

    1、timer的间隔周期准吗?为什么?怎样实现一个精准的timer? 
    NSTimer可以精确到50-100毫秒. 
    NSTimer不是绝对准确的,而且中间耗时或阻塞错过下一个点,那么下一个点就pass过去了

    2、MVC设计模式考虑三种对象:模型对象、视图对象、和控制器对象。

    模型对象代表特别的知识和专业技能,它们负责保有应用程序的数据和定义操作数据的逻辑。

    视图对象知道如何显示应用程序的模型数据,而且可能允许用户对其进行编辑。

    控制器对象是应用程序的视图对象和模型对象之间的协调者。

    3、#import跟#include的区别,@class呢?

     @class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import。
     而#import比起#include的好处就是不会引起交叉编译。

    4、MVC模式的理解

    MVC设计模式考虑三种对象:模型对象、视图对象、和控制器对象。

    模型对象代表特别的知识和专业技能,它们负责保有应用程序的数据和定义操作数据的逻辑。

    视图对象知道如何显示应用程序的模型数据,而且可能允许用户对其进行编辑。

    控制器对象是应用程序的视图对象和模型对象之间的协调者。

    5、线程与进程的区别和联系?

    进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。

    进程和线程的主要差别在于它们是不同的操作系统资源管理方式。

    进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。

    线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。

    所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。

    但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

    6、iOS多线程常见面试题
    在项目什么时候选择使用GCD,什么时候选择NSOperation?
    项目中使用NSOperation的优点是NSOperation是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。
    项目中使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用。
     
    7、block常见面试题
    1 使用block和使用delegate完成委托模式有什么优点?
    使用block实现委托模式,其优点是回调的block代码块定义在委托对象函数内部,使代码更为紧凑;
    适配对象不再需要实现具体某个protocol,代码更为简洁。
     
    8、What are KVO and KVC?
    答案:kvc:键 - 值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。
    很多情况下可以简化程序代码。apple文档其实给了一个很好的例子。
    kvo:键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。
     

    9、When we call objective c is runtime language what does it mean?
    我们说的oc是动态运行时语言是什么意思?
    答案:多态。 主要是将数据类型的确定由编译时,推迟到了运行时。
    这个问题其实浅涉及到两个概念,运行时和多态。
    简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。
    多态:不同对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的方法-eat;
    那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。
    也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。
    因此也可以说,运行时机制是多态的基础?~~~

    10、Polymorphism?
    关于多态性
    答案:多态,父类指针指向子类对象。
    这个题目其实可以出到一切面向对象语言中,
    因此关于多态,继承和封装基本最好都有个自我意识的理解,也并非一定要把书上资料上写的能背出来。
    最重要的是转化成自我理解。 

    11、What is responder chain?
    说说响应链
    答案: 事件响应链。包括点击事件,画面刷新事件等。在视图栈内从上至下,或者从下之上传播。
    可以说点事件的分发,传递以及处理。具体可以去看下touch事件这块。因为问的太抽象化了
    严重怀疑题目出到越后面就越笼统。

    可以从责任链模式,来讲通过事件响应链处理,其拥有的扩展性

    12、Difference between frame and bounds?
    frame和bounds有什么不同?
    答案:frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)
    bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)

    13、常见的object-c的数据类型有那些, 和C的基本数据类型有什么区别?如:NSInteger和int

    object-c的数据类型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等,这些都是class,创建后便是对象,而C语言的基本数据类型int,只是一定字节的内存空间,用于存放数值;NSInteger是基本数据类型,并不是NSNumber的子类,当然也不是NSObject的子类。NSInteger是基本数据类型Int或者Long的别名(NSInteger的定义typedef long NSInteger),它的区别在于,NSInteger会根据系统是32位还是64位来决定是本身是int还是Long。 

     

    14、Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?

    线程创建有三种方法:使用NSThread创建、使用GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue;在主线程执行代码,方法是performSelectorOnMainThread,如果想延时执行代码可以用performSelector:onThread:withObject: afterDelay: 或者使用GCD的函数:dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    // 2秒后异步执行这里的代码...
    });

     

    15、weak和assign的区别

    1.weak:
    (1).在ARC中,在有可能出现循环引用的时候,往往要通过让其中一端使用weak来解决,比如:delegate代理属性
    (2).如果自身已经对它进行一次强引用,没有必要再强引用一次时也会使用weak。比如:自定义IBOutlet控件属性一般也使用weak,当然也可以使用strong
    2.assign:
    用于基础数据类型(例如NSInteger等)和C数据类型(intfloatdoublechar)等,另外还有id类型。

    不同点:
    (1).weak,表明该属性定义了一种“非拥有关系” (nonowning relationship)。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。
    (2).assign也可以修饰对象,但是用assign修饰的对象在释放后,指针的地址还是存在的,也就是说指针并没有被置为nil,会造成众所周知的野指针异常。然而,assign修饰的基础数据类型(例如NSInteger等)和C数据类型(intfloatdoublechar)等一般分配在栈空间上,栈空间的内存会由系统自动处理,当分配的栈空间的内存没有被指针指向时就会被销毁,所以不会造成野指针异常。
    (3).weak比 assign多了一个功能就是当属性所指向的对象消失的时候(也就是内存引用计数为0)会自动赋值为 nil,这样再向 weak修饰的属性发送消息就不会导致野指针操作crash。

    16、__weak和__block的区别?

    __weak 本身是可以避免循环引用的问题的,但是其会导致外部对象释放了之后,block 内部也访问不到这个对象的问题,我们可以通过在 block 内部声明一个 __strong 的变量来指向 weakObj,使外部对象既能在 block 内部保持住,又能避免循环引用的问题。

    __block 本身无法避免循环引用的问题,但是我们可以通过在 block 内部手动把 blockObj 赋值为 nil 的方式来避免循环引用的问题。另外一点就是 __block 修饰的变量在 block 内外都是唯一的,要注意这个特性可能带来的隐患。

    但是__block有一点:这只是限制在ARC环境下。在非arc下,__block是可以避免引用循环的

    17、NSString、NSArray、NSDictionary 等等经常使用copy关键字

    copy的特性,copy是先release旧值,然后对之前的内容copy一份,创建一份新的内存空间,然后把指针指向新的内存空间。

    17、Category剖析

    • Category的方法没有“完全替换掉”原来类已经有的方法,也就是说如果Category和原来类都有methodA,那么category附加完成之后,类的方法列表里会有两个methodA
    • Category的方法被放到了新方法列表的前面,而原来类的方法被放到了新方法列表的后面,这也就是我们平常所说的Category的方法会“覆盖”掉原来类的同名方法,这是因为运行时在查找方法的时候是顺着方法列表的顺序查找的,它只要一找到对应名字的方法,就会罢休,殊不知后面可能还有一样名字的方法。

    17.1、Category和Extension的区别

    1、Extension在编译期决议,它就是类的一部分,在编译期和头文件里的@interface以及实现文件里的@implement一起形成一个完整的类,它伴随类的产生而产生,亦随之一起消亡。Extension一般用来隐藏类的私有信息,你必须有一个类才能为这个类添加Extension,所以你无法为系统的类比如NSString添加Extension。
    2、Category则完全不一样,它是在运行期决议的。
    3、Extension可以添加属性、成员变量,而Category一般不可以。
    总之,就Category和Extension的区别来看,Extension可以添加实例变量,而Category是无法添加实例变量的。因为Category在运行期,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这对编译型语言来说是灾难性的。

    18、Category和Extension的区别

    1、

  • 相关阅读:
    Python基础-字符串方法 、文件操作
    Python基础-列表、字典
    Python基础作业-用户登录
    LeetCode 78. Subsets
    LeetCode 77. Combinations
    LeetCode 76. Minimum Window Substring
    LeetCode 74. Search a 2D Matrix
    LeetCode 73. Set Matrix Zeroes
    LightOJ 1043
    LightOJ 1042
  • 原文地址:https://www.cnblogs.com/needly/p/5037738.html
Copyright © 2011-2022 走看看