`
tempsitegoogle
  • 浏览: 866981 次
文章分类
社区版块
存档分类
最新评论

retain和copy还有assign的区别

 
阅读更多
1. 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b。此时a和b指向同一块内存,请问当a不再需要这块内存,能否直接释放它?答案是否定的,因为a并不知道b是否还在使用这块内存,如果a释放了,那么b在使用这块内存的时候会引起程序crash掉。<wbr><br style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px"><br style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px"><br style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px"> 2. 了解到1中assign的问题,那么如何解决?最简单的一个方法就是使用引用计数(reference counting),还是上面的那个例子,我们给那块内存设一个引用计数,当内存被分配并且赋值给a时,引用计数是1。当把a赋值给b时引用计数增加到2。这时如果a不再使用这块内存,它只需要把引用计数减1,表明自己不再拥有这块内存。b不再使用这块内存时也把引用计数减1。当引用计数变为0的时候,代表该内存不再被任何指针所引用,系统可以把它直接释放掉。<wbr><br style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px"><br style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px"><br style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px"> 3. 上面两点其实就是assign和retain的区别,assign就是直接赋值,从而可能引起1中的问题,当数据为int, float等原生类型时,可以使用assign。retain就如2中所述,使用了引用计数,retain引起引用计数加1, release引起引用计数减1,当引用计数为0时,dealloc函数被调用,内存被回收。<wbr><br style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px"> 4. copy是在你不希望a和b共享一块内存时会使用到。a和b各自有自己的内存。<wbr><br style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px"> 5. atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样:<wbr><br style="padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px"><pre name="code" class="cpp">if (property != newValue) { [property release]; property = [newValue retain]; } </pre> <br> 转载自:http://blog.sina.com.cn/s/blog_6badd5400100voa9.html</wbr></wbr></wbr></wbr></wbr>
分享到:
评论

相关推荐

    @property中的retain,copy,assign区别

    @property中的retain,copy,assign区别

    ios_assign,retain和copy详解

    详细讲解了ios中常用关键字的使用方法的区别,着重讲解了assign,retain,copy之间的区别

    IOS中(assign,retain,copy,weak,strong)的区别以及nonatomic的含义

    IOS中(assign,retain,copy,weak,strong)的区别以及nonatomic的含义 我们在声明@property 属性时,总是要在括号中写上assign、retain、copy、weak、strong中的一个,很多时候,我们仅仅只是按照习惯去写经常写...

    iOS开发之详谈属性设置readwrite、readonly、retain、copy、assign、nonatomic

    主要介绍了iOS开发之详谈属性设置readwrite、readonly、retain、copy、assign、nonatomic的相关资料,需要的朋友可以参考下

    OC中的@property属性问题

    Retain,copy,assign...

    iOS内存管理方面的面试题汇总

    如何检测内存泄漏? 如何解决循环引用?...对 retain,copy,assign,weak,_Unsafe_Unretain 关键字的理解; 深拷贝和浅拷贝的深刻理解; 自动引用计数应遵循的原则; Dealloc 的实现机制; 内存管理方案 ... ... ...

    iOS 面试题

    3. 请问 property 的 作用,assign,copy,retain 的 区别; assign就是基本赋值 copy是重新创建一个oc对象,计数器是1 retain是对计数器+1 4.请写出实现多线程操作涉及的类及 简单 示例; NSThread, ...

    Objective-C内存管理课件.doc

    Objective-C内存管理课件.docx ,assign,retain,copy

    iPhone开发、ObjectiveC_面试题目

    7、定义属性时,什么情况使用copy,assign,和retain 8、autorelease的对象是在什么时候被release的? 9、这段代码有什么问题,如何修改 10、for (int i = 0; i ; i++) { NSString *string = @”Abc”; ...

    iOS 对象属性详细介绍

    retain,strong, copy,weak,assign,readonly, readwrite, unsafe_unretained 下面来分别讲讲各自的作用和区别: retain,计数器加1, (增加一个指向内存的指针) 对应release(计数器-1) setter 方法对参数进行 ...

    iOS面试题分享

    简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是...readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用

    leetcode题库-iOS-Interview-Questions:收集整理iOS笔试面试题

    retain区别 HTTP的数据传输 动态绑定 subclass category protocol extension 区别 单例的实现 performSelector:withObject:方法的作用是什么? 解释一下多态 如何实现深拷贝 http和socket通信的区别,tcp和udp的区别...

    IOS property属性详细介绍使用注意事项

    retain copy assign weak unsafe_unretained 方法命名 getter = setter = &lt;name&gt; 结论 1、原子性  (1)atomic  原子性,可以理解成就是生成getter、setter方法时,编译器会自动为程序添加同步锁,...

    iOS常见的几个修饰词深入讲解

    主要给大家介绍了关于iOS常见的几个修饰词的相关资料,iOS修饰词包括assign、weak、strong、retain、copy、nonatomic、atomic、readonly、readwrite,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

    简述iOS属性中的内存管理参数

    一,assign 代表设置时候直接赋值,而不是复制或者保留它。 二,retain. 会在赋值的时候把新值保留。此属性只能用于Object-C对象类型。 三,copy 在赋值时,将新值复制一份,复制工作由copy执行,此属性只对那些实行...

    BlueToolInstall

    Licensee shall include reproductions of the Broadcom copyright notice with each copy of the Software and any Derivative Work, except where such Software is embedded in a manner not readily accessible...

    polycom宝利通视频会议软件3.9 2018

    Polycom RealPresence 桌面是一个易于使用的视频协作应用程序, 为 PC 用户提供高清质量的音频, 视频和内容共享。与类似的专有应用程序不同, RealPresence 桌面是基于标准的, 并扩展了组织现有的视频启用网络, 使最终...

Global site tag (gtag.js) - Google Analytics