美文网首页
内存管理

内存管理

作者: Li_Po | 来源:发表于2020-10-16 18:03 被阅读0次
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
  • spinlock_t 自旋锁。忙等 适用轻量访问:如引用计数加1减1
  • RefcountMap 引用计数表 通过hash表来实现 通过指针获取引用计数,插入和获取都是通过hash函数计算索引位置,避免循环遍历。提高查找效率
image.png

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

  • weak_table_t 弱引用表 也是hash表 f(key) -> value 找到结构体数组的位置

  • 引用分离锁,多个table表并发访问,提高效率

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

  • 什么是ARC:arc是由编译器llvm和runtime共同协作来实现自动引用计数的管理
  • 为什么weak指针指向的对象在被废弃之后自动置为nil:当对象被废弃之后,dealloc方法内部实现当中会调用清除弱引用的方法。该方法中会通过hash查找被废弃对象在弱引用表中的位置,来提取在弱引用表中的数组,然后通过for循环遍历把每一个弱引用都置为nil。
  • 苹果是如何实现autoreleasePoll的:autoreleasePoll是以栈为节点双向链表合成的数据结构

相关文章

  • iOS内存管理详解

    目录 block内存管理 autorelease内存管理 weak对象内存管理 NSString内存管理 new、...

  • 第10章 内存管理和文件操作

    1 内存管理 1.1 内存管理基础 标准内存管理函数堆管理函数虚拟内存管理函数内存映射文件函数 GlobalMem...

  • 操作系统之内存管理

    内存管理 包括内存管理和虚拟内存管理 内存管理包括内存管理概念、交换与覆盖、连续分配管理方式和非连续分配管理方式(...

  • JavaScript —— 内存管理及垃圾回收

    目录 JavaScript内存管理内存为什么需要管理?内存管理概念JavaScript中的内存管理JavaScri...

  • OC - OC的内存管理机制

    导读 一、为什么要进行内存管理 二、内存管理机制 三、内存管理原则 四、MRC手动内存管理 五、ARC自动内存管理...

  • 3. 内存管理

    内存管理 内存管理包含: 物理内存管理; 虚拟内存管理; 两者的映射 除了内存管理模块, 其他都使用虚拟地址(包括...

  • Go语言——内存管理

    Go语言——内存管理 参考: 图解 TCMalloc Golang 内存管理 Go 内存管理 问题 内存碎片:避免...

  • jvm 基础第一节: jvm数据区

    程序内存管理分为手动内存管理和自动内存管理, 而java属于自动内存管理,因此jvm的职能之一就是程序内存管理 j...

  • 内存管理

    内存管理的重要性。 不进行内存管理和错误的内存管理会造成以下问题。 内存泄露 悬挂指针 OC内存模型 内存管理是通...

  • 11-AutoreleasePool实现原理上

    我们都知道iOS的内存管理分为手动内存管理(MRC)和自动内存管理(ARC),但是不管是手动内存管理还是自动内存管...

网友评论

      本文标题:内存管理

      本文链接:https://www.haomeiwen.com/subject/ymrzpktx.html