- 在iOS使用引用计数来管理OC对象的内存
- 一个新创建的OC对象的引用计数是1,当引用计数减为0,OC对象就会销毁,释放其占用的内存空间
- 调用
retain
会让OC对象的引用计数+1,调用release
会让OC对象的引用计数-1
- 当调用
alloc
new
copy
mutableCopy
方法返回了一个对象,在不需要这个对象的时候,要调用 release``autorelease
释放它
- 想拥有某个对象,就让它的引用计数+1;不想再拥有某个对象,就让它的引用计数-1
copy和mutableCopy
|
copy |
mutableCopy |
NSString |
NSString浅拷贝
|
mutableCopy深拷贝
|
NSSMutableString |
NSString深拷贝
|
mutableCopy深拷贝
|
NSArray |
同上 |
同上 |
NSMutableArray |
同上 |
同上 |
NSDictionary |
同上 |
同上 |
NSMutableDictionary |
同上 |
同上 |
引用计数的存储
- 在64bit中,引用计数可以直接存储在优化过的isa指针中,也可能存储在
SideTable
类中
// refcnts
是一个存放着对象引用计数的散列表
struct SideTable {
spinlock_t slock;
RefcountMap refcnts;
weak_table_t weak_table;
}
dealloc
- 当一个对象要释放时,会自动调用
dealloc
,调用轨迹:
dealloc
_objc_rootDealloc
rootDealloc
object_dispose
objc_destructInstance
free
void *objc_destructInstance(id obj)
{
if (obj) {
// Read all of the flags at once for performance.
bool cxx = obj->hasCxxDtor();
bool assoc = obj->hasAssociatedObjects();
// This order is important.
if (cxx) object_cxxDestruct(obj);// 清除成员变量
if (assoc) _object_remove_assocations(obj);
obj->clearDeallocating();// 指向当前对象的弱指针置为nil
}
return obj;
}
自动释放池
网友评论