美文网首页IOS开发知识点
内存管理:autoreleasepool与runloop

内存管理:autoreleasepool与runloop

作者: 嗯o哼 | 来源:发表于2020-07-16 19:23 被阅读0次

两者仿佛并没有直接的关系,查看runloop源码执行的过程中也并未出现过autoreleasepool相关的逻辑。
但是如果打印[NSRunLoop currentRunLoop]

NSLog(@"%@",[NSRunLoop currentRunLoop]);

会发现runloop中注册了两个与autoreleasepool相关的通知

<CFRunLoopObserver 0x600001d145a0 [0x7fff80617cb0]>{
valid = Yes, activities = 0x1, repeats = Yes, order = -2147483647, 
callout = _wrapRunLoopWithAutoreleasePoolHandler (0x7fff4808bf54),
 context = <CFArray 0x6000022454a0 [0x7fff80617cb0]>{
type = mutable-small, count = 1, values = (
    0 : <0x7fabae001038>
)}}
<CFRunLoopObserver 0x600001d14640 [0x7fff80617cb0]>{
valid = Yes, activities = 0xa0, repeats = Yes, order = 2147483647, 
callout = _wrapRunLoopWithAutoreleasePoolHandler (0x7fff4808bf54), context = <CFArray 0x6000022454a0 [0x7fff80617cb0]>{
type = mutable-small, count = 1, values = (
    0 : <0x7fabae001038>
)}}

第一个监听的是activities 是 NSRunLoopEntry状态,说明当runloop进入entry状态的时候,会调用_wrapRunLoopWithAutoreleasePoolHandler
,其内部会调用_objc_autoreleasePoolPush()创建自动释放池。
第二个监听的activities是 NSRunLoopBeforeWaiting 和NSRunLoopExit,BeforeWaiting 其回调方法_wrapRunLoopWithAutoreleasePoolHandler内部会调用先调用pop操作,然后再push 创建一个新的自动释放池。Exit会调用pop操作。
顺序就是Entry-->push ---> BeforeWaiting--->pop-->push -->Exit-->pop,按照这样的顺便,保证了,没一次push都对应一个pop。

autoreleasepool释放操作在每一次runloop 的BeforeWaiting和exit的时候执行的

相关文章

网友评论

    本文标题:内存管理:autoreleasepool与runloop

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