You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在DriverKit驱动中创建自定义OSObject子类?

DriverKit中自定义OSObject子类的实现方法

DriverKit完全支持创建继承自OSObject的自定义类,用于存入OSArray等基于OSObject的集合中。你遇到的问题是因为没有遵循DriverKit的对象模型规范,正确的实现步骤如下:

1. 类声明(头文件)

需要使用OSDeclareDefaultStructors宏声明元类和默认构造相关逻辑,确保继承OSObject:

#include <DriverKit/OSObject.h>
#include <os/log.h>

class MyCustomObject : public OSObject
{
    OSDeclareDefaultStructors(MyCustomObject);
    using super = OSObject;

public:
    // 重写初始化方法
    bool init() override;
    // 重写释放方法
    void free() override;

    // 自定义静态创建方法(类似传统withFoo)
    static MyCustomObject* create();
};

2. 类实现(源文件)

用OSDefineMetaClassAndStructors宏定义元类和构造逻辑,同时实现初始化、释放和静态创建方法:

#include "MyCustomObject.h"

// 定义元类和默认构造/析构逻辑
OSDefineMetaClassAndStructors(MyCustomObject, OSObject);

bool MyCustomObject::init()
{
    if (!super::init()) {
        os_log(OS_LOG_DEFAULT, "[Driver] MyCustomObject super::init() failed");
        return false;
    }

    // 在这里添加自定义成员的初始化逻辑
    return true;
}

void MyCustomObject::free()
{
    // 在这里释放自定义的retained成员(比如OSString、OSArray等)

    super::free();
}

MyCustomObject* MyCustomObject::create()
{
    // 使用OSTypeAlloc分配内存(不能用new,因为OSObject构造函数是protected)
    MyCustomObject* obj = OSTypeAlloc(MyCustomObject);
    if (obj != nullptr) {
        // 调用初始化方法,失败则释放实例
        if (!obj->init()) {
            obj->release();
            obj = nullptr;
        }
    }
    return obj;
}

关键注意事项

  • 不能用new创建实例:OSObject的构造函数是protected的,DriverKit要求使用OSTypeAlloc(或OSObject::allocate)分配内存,再手动调用init完成初始化。
  • 引用计数规则:自定义类遵循DriverKit的引用计数机制,使用retain()/release()管理生命周期,不能用delete销毁实例,free()会在引用计数归零时自动被调用。
  • 集合存储:将实例存入OSArray等集合时,集合会自动调用retain()持有实例,移除时调用release(),无需手动管理这部分引用计数。

内容的提问来源于stack exchange,提问作者Andrew Madsen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 14:42:56