对象是在什么时候被release的?

本文深入解析Autorelease机制:对象在引用计数为0时被release;Autorelease将调用release延迟,通过Autorelease pool管理;Runloop结束时,当前pool销毁,其中对象被release。

<wbr></wbr>

对象是引用计数为0release的.


autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Autorelease pool中,当该pool被释放时,该pool中的所有Object会被调用Release。对于每一个Runloop 系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object(就是autorelease的对象)会被release。那什么是一个Runloop呢? 一个UI事件,Timer call delegate call 都会是一个新的Runloop

在 Linux 设备模型中,`put_device()` 是用于减少设备对象引用计数的函数,当引用计数归零时,会触发设备资源的释放流程。该过程会检查设备所属的 `device_type` 是否定义了 `release` 方法,并在适当的时候调用它以完成设备类型级别的资源清理。 具体而言,当 `put_device()` 被调用时,它会调用 `kobject_put()` 来减少设备内嵌的 `kobject` 的引用计数。当 `kobject` 的引用计数归零时,会触发 `kobject_cleanup()`,进而调用 `dev->release` 函数指针所指向的释放函数。如果 `dev->release` 未被显式设置,但设备属于某个 `device_type`,则内核会尝试使用该类型中定义的 `release` 方法。例如,`struct device_type` 中的 `.release` 回调函数会被调用,以释放与该设备类型相关的资源[^1]。 以下是一个典型的调用流程: ```c put_device(dev); // 减少引用计数 kobject_put(&dev->kobj); // 可能触发 kobject_cleanup kobject_cleanup(&dev->kobj); // 检查是否需要释放 dev->release(dev); // 最终调用 release 方法 ``` 在实现上,`device_type` 中的 `release` 方法应被正确设置,例如在定义设备类型时指定 `.release = my_device_type_release`。这样,当设备对象的引用计数归零时,内核会自动调用该方法,确保设备类型相关的资源被正确清理[^3]。 ### 示例代码 以下是一个示例,展示如何定义并注册一个带有 `release` 方法的 `device_type`: ```c struct device_type my_device_type = { .name = "my_device", .release = my_device_release, }; void my_device_release(struct device *dev) { // 释放设备类型相关的资源 kfree(dev); } ``` 在设备初始化时,应将设备对象的 `type` 成员指向该 `device_type` 实例: ```c dev->type = &my_device_type; ``` 这样,当 `put_device(dev)` 被调用且引用计数归零时,内核会自动调用 `my_device_release()` 函数。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值