如何在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
相关产品推荐
相关产品推荐

