我正在尝试在目标C中包装一个C库,以便可以让ARC处理C对象的创建和销毁。这是我的问题...如何包装返回C对象的C库函数,例如:
thing *getRelatedThing(thing *otherFoo);
我知道Objective-C中的方法签名必须是:
@interface Thing {
@private
thing *_myThing;
}
- (Thing *)getRelatedThing;
@end
从
Thing
转到thing*
很容易,但是我很难找出实现反向查找的最佳方法。到目前为止,我对提出的想法并不感到兴奋:修改C库,以将指针添加回Objective-C对象。
创建一个将C对象映射到Objective-C对象的全局字典。
还有其他想法吗?
这是我要完成的任务的更多上下文:
C库
thing *newThing();
void deleteThing(thing *ptr);
void doSomething(thing *ptr);
thing *getRelatedThing(thing *otherFoo);
Objective-C标头
@interface Thing {
@private
thing *_myThing;
}
- (id)init;
- (void)doSomething;
- (Thing *)getRelatedThing;
@end
**目标C实作
@implementation Thing
- (id)init
{
if(self = [super init]) {
_myThing = newThing();
if(!_myThing) return nil;
}
return self;
}
- (void)dealloc
{
deleteThing(_myThing);
}
- (void)doSomething
{
doSomething(_myThing);
}
- (Thing *)getRelatedThing
{
thing *otherThing = getRelatedThing(_myThing);
return nil; // Need to return a Thing object instead
}
@end
最佳答案
我之前做过类似的事情,而我正在使用第一种方法。 (C ++库本身支持void *
用户上下文指针,因此我不需要添加它)
但是在决定走哪条路之前,您需要清楚事物的工作方式。
内存管理如何工作?您的ObjC对象是否持有对C对象的强引用或其他方式?确保不创建保留周期。
ObjC对象和C对象之间是一对一的关系吗?如果ObjC对象只是纯包装器,则每次需要将C对象转换为ObjC对象时,都可以新建一个包装器。由于它本身不包含任何有用的信息,因此可以毫无问题地将其丢弃并重新创建。
一种可能的解决方案
除了您的公共标题
// private header
@interface Thing ()
- (id)initWithThing:(thing *)thing;
@end
@implementation Thing
// in addition to your other methods
- (id)initWithThing:(thing *)thing
{
if(self = [super init]) {
_myThing = thing;
if(!_myThing) return nil;
}
return self;
}
- (id)init
{
return [self initWithThing:newThing()];
}
- (Thing *)getRelatedThing
{
thing *otherThing = getRelatedThing(_myThing); // assume caller responds to release otherThing
return [[Thing alloc] initWithThing:otherThing];
}
@end
关于objective-c - C库的 objective-c 包装器:包装返回Obj-C对象的调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20111504/