内存管理

2020-10-16  本文已影响0人  Li_Po
image.png

内存管理 方案

1.TaggedPointer //小对象 如:nsnumber

2.NONPOINTER_ISA // 非指针型isa 64位系统中32到40的bite放指针,为提高内存利用率,其他放内存管理相关内容

image.png
image.png

1位(indexed:0代表纯isa指针,1代表有类对象地址和内存管理内容)
2位 has_assoc 当前对象是否有关联对象(0没有1有)
3位 has_cxx_dtor 是否使用c++内容
4-36位 共33位当前对象地址
42位 weakly是否有弱引用
43位 deallocating 当前对象是否进行dealloc操作
44位 has_sidetable_rc 当引用计数达到上限后,需外挂一个散列表
45-64位 extra_rc 额外的引用计数

3.散列表SideTables 有多个Side Table结构。

image.png
image.png

64位引用计数表 1 weakly,2,deallocating,3-64 RC引用计数值

image.png
image.png

快速分流 f(key)->value 通过hash函数将对象指针key计算出hash值value。快速查找到value在side tablev表 数组中的位置 下标索引

image.png

引用计数管理

alloc的实现,经过一系列调用,最终调用c函数的calloc
此时并没有设置引用计数为1,但是通过retainCount获取是1。


image.png

经过两次hash查找
1.通过当前对象指针this经过hash函数计算,获取sideTables中对应的sideTable。
2.通过当前对象指针this获取sideTable中对应的引用计数值。
3.对引用计数加1,这个宏实际是经过了一个偏移量4。


image.png
image.png
image.png
image.png
image.png
image.png

弱引用管理

image.png
image.png
image.png

自动释放池

自动释放池:
是以栈为节点通过双向链表的形式组合而成的
是和线程一一对应的


image.png
image.png
image.png
image.png
image.png
image.png
image.png

循环引用

解决NSTimer产生的循环引用
import "NSTimer+WeakTimer.h"
@interface TimerWeakObject : NSObject
@property(nonatomic,weak)id target;
@property(nonatomic,assign)SEL selector;
@property(nonatomic,weak)NSTimer * timer;
-(void)fire:(NSTimer *)timer;
@end
@implementation TimerWeakObject
-(void)fire:(NSTimer *)timer{
if (self.target) {
if ([self.target respondsToSelector:self.selector]) {
[self.target performSelector:self.selector withObject:timer.userInfo];
}
}else{
[self.timer invalidate];
}
}
@end
@implementation NSTimer (WeakTimer)
+(NSTimer *)scheduledWeakTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo{
TimerWeakObject * obj = [[TimerWeakObject alloc] init];
obj.target = aTarget;
obj.selector = aSelector;
obj.timer = [NSTimer scheduledTimerWithTimeInterval:ti target:aTarget selector:@selector(fire:) userInfo:userInfo repeats:yesOrNo];
return obj.timer;
}
@end

上一篇 下一篇

猜你喜欢

热点阅读