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

简述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:

  - (NSString*) value  {
             @synchronized(self) {
             return [[_value retain] autorelease];
   }
 }
    - (void) setValue:(NSString*)aValue {
        @synchronized(self) {
        [aValue retain];
        [_value release];
        _value = aValue;
     }
  }
  • 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

 
 
 

ios开发——面试篇(一)的更多相关文章

  1. ios开发——面试篇C语言精华

    面试篇C语言精华    1.面向过程:分析解决问题所需要的步骤,然后用函数把这些步骤一步一步实 现. 面向对象:直接描述客观世界的对象及其相互关系.现实世界中任何实体都 可以看作是对象,对象之间通过消 ...

  2. iOS开发UI篇—CAlayer(自定义layer)

    iOS开发UI篇—CAlayer(自定义layer) 一.第一种方式 1.简单说明 以前想要在view中画东西,需要自定义view,创建一个类与之关联,让这个类继承自UIView,然后重写它的Draw ...

  3. iOS开发多线程篇—多线程简单介绍

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  4. iOS开发UI篇—UITabBarController简单介绍

    iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...

  5. iOS开发UI篇—懒加载

    iOS开发UI篇—懒加载 1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了, ...

  6. iOS开发网络篇—数据缓存

      iOS开发网络篇—数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造 ...

  7. iOS开发UI篇—CAlayer层的属性

    iOS开发UI篇—CAlayer层的属性 一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property ...

  8. iOS开发UI篇—CAlayer(创建图层)

    iOS开发UI篇—CAlayer(创建图层) 一.添加一个图层 添加图层的步骤: 1.创建layer 2.设置layer的属性(设置了颜色,bounds才能显示出来) 3.将layer添加到界面上(控 ...

  9. iOS开发UI篇—CALayer简介

    iOS开发UI篇—CALayer简介   一.简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. 其实 ...

随机推荐

  1. 联通光纤上网配置+华为HG8240光猫+TL-WR842N

    最近搬家改用北京联通宽带,光纤入户的那种.联通送的光猫是华为HG8240,没看到天线,应该是不带无线路由.然后自己再买了个TP-Link的TL-WR842N,用来组局域网,也供ipad.kindle. ...

  2. Oracle归档方式设置

    一 设置为归档方式Sql代码 sql> archive log list; #查看是不是归档方式 sql> alter system set log_archive_start=true ...

  3. T-SQL 常用语句学习

    一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server ---  ...

  4. 将VLC库封装为duilib的万能视频播放控件

    转载请说明出处,谢谢~~ 昨天封装好了基于webkit的浏览器控件,修复了duilib的浏览器功能的不足,而我的仿酷狗播放器项目中不光需要浏览器,同时也需要视频播放功能,也就是完成MV的功能.所以我打 ...

  5. Asp.Net中文本换行

    Asp.Net中文本换行 VB.NET Function HtmlCode(ByVal fString)        If fString <> "" Then    ...

  6. Jquery扩展-手把手带你体验

    Jquery扩展是在项目中经常用到的,有时候为了提取一些公共方法,有时候为了模块化管理等等,下面我们来体验一下.当然扩展离不开Jquery几个基础方法 1:$.extend() 2:$.fn.func ...

  7. Java处理InterruptedException异常小结

    对于InterruptedException,一种常见的处理方式是捕捉它,然后什么也不做(或者记录下它,不过这也好不到哪去).不幸的是,这种方法忽略了这样一个事实:这期间可能发生中断,而中断可能导致应 ...

  8. ocp 1Z0-042 61-120题解析

    61. View the Exhibit.Which statement regarding the dept and emp tables is true?A) When you delete a ...

  9. [iOS UI进阶 - 2.3] 彩票Demo v1.3

    A.需求 真机调试 "关于”模块 存储开关状态 打电话.发短信 应用评分 打开其他应用 cell 在iOS6 和 iOS7的适配 block的循环引用 屏幕适配 code source:   ...

  10. C#学习笔记(十六):Attribute

    Attribute可以为类或方法添加一些附加的信息,我们可以看看MSDN对Attribute的描述: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注 ...