【iOS-内存管理】
2018-09-26 本文已影响10人
GeniusWong
- 在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;
}