##内存管理方式
- 手动引用计数
- ARC自动引用计数
- 垃圾回收
###手动引用计数
Cocoa 环境的 Objective-C 中,每个对象都有一个用来记录引用计数的整数
当某段代码使用到这个对象时就应该将这个整数+1
,不需要时-1
。
使用alloc
和init
创建一个对象后,这个对象的引用计数值为1
1 | //操作引用计数值的方法: |
####自动释放
在代码中经常会使用很多临时对象,如果都要逐个释放内存会很麻烦
可以将所有需要发送release
的对象记录下来,再需要释放时统一发送release
消息
使用方法如下
1 | //NSAutoreleasePool 自动释放池 |
通过alloc init
生成的对象需要手动发送autorelease
消息
除此之外还有一种创建临时对象的方法,声称对象后会被直接加入内部自动释放池
1 | //以NSString为例 |
###ARC自动引用计数
ARC只管理Objective-C 的对象,无法控制
malloc
分配的内存禁用和引用计数有关的函数
retain
,release
,autorelease
,dealloc
ARC是编译期技术,例如:
1 | s = w; |
- 管理自动释放池的新语法
1 | @autoreleasepool{ |
在ARC中未指定初始值的变量都会被初始化为nil
ARC中dealloc方法定义
1 | //未开启ARC时: |
###循环引用和弱引用
- 循环引用
1 | @interface People : NSObject { |
- 弱引用
1 | __weak id temp; |
###ARC的一些限制
- ARC有效时,不可以在C语言的结构体中定义objc对象
如果一定要使用的话可以加__unsafe_unretained
修饰符,这样的话就需要手动管理这部分内存
1 | struct C { |
###垃圾回收 see