我正在尝试在目标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/

10-10 08:20