美文网首页
iOS基本面试题

iOS基本面试题

作者: AbaryLiu | 来源:发表于2019-04-22 09:42 被阅读0次

    1、synthesize和dynamic有什么作用?

    • synthesize:
      是系统自动生成getter和setter属性声明;@synthesize的意思是,除非开发人员已经做了,否则由编译器生成相应的代码,以满足属性声明;
    • dynamic:
      是开发者自已提供相应的属性声明,@dynamic意思是由开发人员提供相应的代码:对于只读属性需要提供getter,对于读写属性需要提供 setter 和getter。

    2、#define和const变量有什么区别?

    define在预处理阶段进行简单的替换,const在编译阶段使用
    define不做类型检查,仅仅展开替换,const有数据类型,会执行类型检查
    define不分配内存,仅仅展开替换,const会分配内存
    define不能调试,const可以调试
    define定义的常量在替换后运行过程中会不断地占用内存,而const定义的常量存储在数据段,只有一份copy,效率更高
    definde可以定义一些简单的函数,const不可以

    3、请分别说明@public、@protected、@private的含义与作用?

    • @public:对象的实例变量的作用域在任意地方都可以被访问 ;
    • @protected:对象的实例变量作用域在本类和子类都可以被访问 ;
    • @private:实例变量的作用域只能在本类(自身)中访问 .

    4、为什么block属性要使用copy来修饰?

    因为不用copy修饰的访问外部变量的block,只在他所在的函数被调用的那一瞬间可以使用。之后就消失了。
    如果是堆中的block,也就是copy修饰的block。他的生命
    周期就是随着对象的销毁而结束的。只要对象不销毁,我们就可以调用的到在堆中的block。所以使用copy修饰block目的是将block保存到堆里面。

    5、属性可以拥有的特质可以分为四类:

    • 原子性(atomic)、非原子性(nonatomic)
    • 读写权限(readwrite、readonly)
    • 内存管理语义(assgin,strong,weak,copy)
    • 方法名getter=<name>、setter=<name>

    6、属性的作用是什么?

    主要的作用就在于封装对象中的数据。

    7、属性的本质是什么?

    属性的本质是实例变量与存取方法的结合。
    @property = ivar + getter + setter

    8、用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?

    • 因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本.
    • 如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.

    9、类别和类延展的区别?

    category和extensions的不同在于后者可以添加属性。另外后者添加的方法是必须要实现的。
    extensions可以认为是一个私有的Category。

    10、如何让 Category 支持属性?

    • category中不能添加属性,是因为可以声明属性,添加到该类的属性列表并声明getter和setter方法,但是并不会生成对应的成员变量,所以不能添加属性。UIView的分类是getter和setter方法调用了本类的其他属性。
    • 如果要category支持属性,就只能使用运行时objc_getAssociatedObject / objc_setAssociatedObject来访问和生成关联对象。

    11、代理的作用是什么?

    代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。

    12、请谈谈堆和栈的区别

    • 栈区(stack)由编译器自动分配释放 ,存放方法(函数)的参数值, 局部变量的值等,栈是向低地址扩展的数据结构,是一块连续的内存的区域。即栈顶的地址和栈的最大容量是系统预先规定好的。
    • 堆区(heap)一般由程序员分配释放, 若程序员不释放,程序结束时由OS回收,向高地址扩展的数据结构,是不连续的内存区域,从而堆获得的空间比较灵活。

    13、请你谈谈Objective-c的内存管理机制?

    Objective-c中的对象都是基于引用计数来管理生命周期,简单的来说就是,我们需要持有一个对象时,调用retain让它的引用计数+1,不需要的这个对象的时候,调用release让它的引用计数-1。当一个对象的引用计数为0时,这个对象就会被自动销毁。

    14、请你谈谈TCP的三次握手。

    • 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
    • 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN+RECV状态;
    • 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次状态。

    15、您一般是怎么用 Instruments 的?

    • Time Profiler:性能分析
    • Zombies:检查是否访问了僵尸对象,但是这个工具只能从上往下检查,不智能
    • Allocations:用来检查内存,写算法的那批人也用这个来检查
    • Leaks:检查内存,看是否有内存泄露

    16、有哪些常见的crash场景?

    • 访问了野指针
    • 访问了僵尸对象
    • 访问了不存在的方法
    • 数组下标越界
    • 在定时器下一次回调前将定时器提前释放

    17、熟悉 CocoaPods 么?能大概讲一下工作原理么?

    CocoaPods的原理是将所有的依赖库都放到另一个名为Pods的项目中,然后让主项目依赖Pods项目,这样,源码管理工作都从主项目移到了Pods项目中。Pods项目最终会编译成一个名为libPods.a的文件,主项目只需要依赖这个.a文件即可。

    18、UIView和CALayer的区别和联系?

    • 区别:
      UIView和CALayer最大的区别是UIView可以接受并处理触摸事件,而CALayer不可以。
    • 联系:
      每个UIView内部都有一个CALayer在背后提供内容的绘制和显示,并且UIView的尺寸样式都由内部的CALayer所提供。

    19、遇到tableView卡顿嘛?会造成卡顿的原因大致有哪些?

    • 最常用的就是cell的重用, 注册重用标识符
    • 避免cell的重新布局
    • 提前计算并缓存cell的属性及内容
    • 减少cell中控件的数量
    • 不要使用ClearColor,无背景色,透明度也不要设置为0,因为渲染耗时比较长
    • 使用局部更新
    • 加载网络数据,下载图片,使用异步加载,并缓存
    • 缓存行高
    • 少使用addView 给cell动态添加view

    20、控制器的生命周期?

    • loadView: 加载view
    • viewDidLoad: view加载完毕
    • viewWillAppear: 控制器的view将要显示
    • viewWillLayoutSubviews: 控制器的view将要布局子控件
    • viewDidLayoutSubviews: 控制器的view布局子控件完成
    • viewDidAppear: 控制器的view完全显示
    • viewWillDisAppear: 控制器的view即将消失
    • viewDidDisAppear: 控制器的view完全消失

    21、进程和线程的区别?

    进程和线程的主要差别在于它们是不同的系统资源管理方式。进程独有的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。

    22、进程的持有实体分为那几个?

    • CPU
    • 内存
      • 堆区
      • 栈区
      • 全局区
      • 常量区
      • 代码区

    23、事件响应的原理?

    1. 一个UIView发出一个事件之后,首先上传给其父视图、
    2. 父视图上传给其所在的控制器
    3. 如果其控制器对事件进行处理,事件传递将终止,否则继续上传父视图
    4. 直到遇到响应者才会停止,否则事件将一直上传,直到UIWindow

    24、自动释放池的工作原理?

    自动释放池是NSAutorelease类的一个实例,当向一个对象发送autorelease消息时,该对象会自动入池,待池销毁时,将会向池中所有对象发送一条release消息,释放对象,[pool release]、[pool drain]表示的是池本身不会销毁,而是池子中的临时对象都被发送release,从而将对象销毁。

    24、KVO的实现原理?

    • KVO是基于runtime机制实现的
    • 当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法。派生类在被重写的setter方法实现真正的通知机制

    25、http请求中包括那些?

    • http请求是客户端往服务端发送请求动作,告知服务器自己的要求。
    • http请求由状态行、请求头、请求正文三部分组成:
    • 状态行:包括请求方式Method、资源路径URL、协议版本Version;
    • 请求头:包括一些访问的域名、用户代理、Cookie等信息;
    • 请求正文:就是HTTP请求的数据。
    • 备注:请求方式Method一般有GET、POST、PUT、DELETE,含义分别是获取、修改、上传、删除,其中GET方式仅仅为获取服务器资源,方式较为简单,因此在请求方式为GET的HTTP请求数据中,请求正文部分可以省略,直接将想要获取的资源添加到URL中。

    相关文章

      网友评论

          本文标题:iOS基本面试题

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