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

  • 相关阅读:
    451. Sort Characters By Frequency
    424. Longest Repeating Character Replacement
    68. Text Justification
    44. Wildcard Matching
    160. Intersection of Two Linked Lists
    24. Swap Nodes in Pairs
    93. 递归实现组合型枚举
    98. 分形之城
    97. 约数之和
    96. 奇怪的汉诺塔
  • 原文地址:https://www.cnblogs.com/stronger-ios-lcx/p/5629855.html
Copyright © 2011-2022 走看看