retain、strong、weak、assign区别
2016-03-04 17:42
337 查看
1. 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b。此时a 和b指向同一块内存,请问当a不再需要这块内存,能否直接释放它?答案是否定的,因为a并不知道b是否还在使用这块内存,如果a释放了,那么b在使用这块内存的时候会引起程序crash掉。
2. 了解到1中assign的问题,那么如何解决?最简单的一个方法就是使用引用计数(reference counting),还是上面的那个例子,我们给那块内存设一个引用计数,当内存被分配并且赋值给a时,引用计数是1。当把a赋值给b时引用计数增加到 2。这时如果a不再使用这块内存,它只需要把引用计数减1,表明自己不再拥有这块内存。b不再使用这块内存时也把引用计数减1。当引用计数变为0的时候,代表该内存不再被任何指针所引用,系统可以把它直接释放掉。
3. 上面两点其实就是assign和retain的区别,assign就是直接赋值,从而可能引起1中的问题,当数据为int, float等原生类型时,可以使用assign。retain就如2中所述,使用了引用计数,retain引起引用计数加1, release引起引用计数减1,当引用计数为0时,dealloc函数被调用,内存被回收。
4. copy是在你不希望a和b共享一块内存时会使用到。a和b各自有自己的内存。
1.assign: 用于非指针变量。用于基础数据类型 (例如NSInteger)和C数据类型(int, float, double, char)另外还有id
反正记住:前面不需要加 “*” 的就用assign吧,weak 就是相当于assign 2. retian :释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1,用于指针变量。就是说你定义了一个变量,然后这个变量在程序的运行过程中会被更改,并且影响到其他方法。xcode4.3及以后版本上面开发,retian和strong都是一样的,没区别 3. copy : 效果其实和retain没什么两样,唯一的区别就是copy只用于NSString而不能用于NSMutableString,如果当一个类继承NSObject,那么这个类里面的属性需要使用copy。 retain是指针拷贝,copy是内容拷贝。相关文章推荐
- Git配置全局和独立仓库的username和email配置
- 进阶篇:以IL为剑,直指async/await
- 使用WebDriverWait类处理等待(sleep)的问题
- HDOJ-1789 Doing Homework again
- 使用AFN 的POST请求出现错误"Error Domain=NSCocoaErrorDomain Code=3840 "决绝方案
- HDU 3356 ||POJ 3996Air Strike(贪心)
- hdu 4630 No Pain No Game 线段树离线处理
- pthread_cond_wait()与pthread_cond_signal()
- quartz报错:SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-op
- Forcing the Removal of a Domain Controller
- Thread 常搞混的几个概念sleep、wait、yield、interrupt
- 打造你的办公环境-email篇
- 【什么是长尾关键词(Long Tail Keyword)】
- 在mac上用Xcode写程序, run的时候总是失败, 显示clang: error: linker command failed with exit code 1
- How To Reclaim Wasted Space on The Segment (Table, Index and LOB) and Tablespace Levels (文档 ID 16827
- 怎样用好ZBrush中的PaintStop插件
- At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for 。。。
- hair gene (news)
- 软件RAID5项目实战!!!
- 软件RAID5项目实战!!!