zoukankan      html  css  js  c++  java
  • iOS开发--面试总结(二)

    面试篇之内存管理与多线程

    简述OC中内存管理机制。­­­­­与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用?并区别strong(强引用)、 weak(弱引用)?什么情况使用copy,assign,和retain?

    管理机制:使用了一种叫做引用计数的机制来管理内存中的对象。OC中每个对象都对应着他们自己的引用计数,引用计数可以理解为一个整数计数器,当使用alloc方法创建对象的时候,持有计数会自动设置为1。当你向一个对象发送retain消息 时,持有计数数值会增加1。相反,当你像一个对象发送release消息时,持有计数数值会减小1。当对象的持有计数变为0的时候,对象会释放自己所占用的内存。

    • retain(引用计数加1)->release(引用计数减1)
    • alloc(申请内存空间)->dealloc(释放内存空间)
    • readwrite: 表示既有getter,也有setter   (默认)
    • readonly: 表示只有getter,没有setter
    • nonatomic:不考虑线程安全
    • atomic:线程操作安全   (默认)

    线程安全情况下的setter和getter:

    复制代码
     1  - (NSString*) value  {    
     2             @synchronized(self) {        
     3             return [[_value retain] autorelease];   
     4   }
     5 }
     6    - (void) setValue:(NSString*)aValue {    
     7        @synchronized(self) {        
     8        [aValue retain];        
     9        [_value release];        
    10        _value = aValue;     
    11     } 
    12  }
    复制代码
    • retain: release旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1
    • assign: 简单赋值,不更改索引计数    (默认)
    • copy: 其实是建立了一个相同的对象,地址不同(retain:指针拷贝  copy:内容拷贝)
    • strong:(ARC下的)和(MRC)retain一样    (默认)
    • weak:(ARC下的)和(MRC)assign一样, weak当指向的内存释放掉后自动nil化,防止野指针
    • unsafe_unretained 声明一个弱应用,但是不会自动nil化,也就是说,如果所指向的内存区域被释放了,这个指针就是一个野指针了。
    • autoreleasing 用来修饰一个函数的参数,这个参数会在函数返回的时候被自动释放。

    1、            类变量的@protected ,@private,@public,@package,声明各有什么含义?

    @private:作用范围只能在自身类

    @protected:作用范围在自身类和继承自己的子类  (默认)

       @public:作用范围最大,可以在任何地方被访问。

    @package:这个类型最常用于框架类的实例变量,同一包内能用,跨包就不能访问

    2、            线程是什么?进程是什么?二者有什么区别和联系?

    一个程序至少有一个进程,一个进程至少有一个线程:

    进程:一个程序的一次运行,在执行过程中拥有独立的内存单元,而多个线程共享一块内存

    线程:线程是指进程内的一个执行单元。

    联系:线程是进程的基本组成单位

           区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
                 (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
                 (3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
                 (4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

    举例说明:操作系统有多个软件在运行(QQ、office、音乐等),这些都是一个个进程,而每个进程里又有好多线程(比如QQ,你可以同时聊天,发送文件等)

    3、            谈谈你对多线程开发的理解?ios中有几种实现多线程的方法?

    好处:1.使用线程可以把占据时间长的程序中的任务放到后台去处理

    2.用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度

    3.程序的运行效率可能提高

    4·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。

    缺点:1.如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。

    2.更多的线程需要更多的内存空间。

    3.线程的中止需要考虑其对程序运行的影响。

    4.通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。

    实现多线程的方法:

    1. NSObject类方法NSThreadNSOperationGCD

    4、            多线程同步和异步的区别?IOS中如何实现多线程的同步?

    异步:举个简单的例子 就是游戏,游戏会有图像和背景音乐

    同步:是指一个线程要等待上一个线程执行完之后才开始执行当前的线程,上厕所

    关键字@synchronized()

    NSOperationQueue:maxcurrentcount 

    NSConditionLock

  • 相关阅读:
    【记录】【MySQL】填充字符串函数 LPAD(str,len,padstr)
    nvm安装node和npm,个人踩坑记录
    win10系统下cmd输入一下安装的软件命令提示拒绝访问解决办法
    bootstrap大图轮播手机端不能手指滑动解决办法
    JS中函数声明与函数表达式的异同
    javaScript实现归并排序
    js插入节点appendChild和insertBefore
    JS的事件冒泡和事件捕获
    js 停止事件冒泡 阻止浏览器的默认行为
    事件绑定的几种常见方式
  • 原文地址:https://www.cnblogs.com/stronger-ios-lcx/p/5629855.html
Copyright © 2011-2022 走看看