使用** void参数从swift访问目标c函数

时间:2014-06-06 11:40:40

标签: objective-c swift

这主要是一个“学术”问题,所以请不要问“你为什么要这样做”: - )

我有这个客观的c方法,我没有使用ARC(我知道如果我不释放分配的字符串就会泄漏)。 此方法获取指向内存中指针的指针,然后将指向的内容更改为NSMutableString。

+(void) writeString:(void **)var
{
    NSMutableString *aString = [[NSMutableString alloc] initWithFormat:@"pippo %@", @"pluto"];
    *var = aString;
}

从Objective C我以这种方式访问​​它并且它可以正常工作

NSString *str;
[FLSwiftUtils writeString:&str];
NSLog(@"%@", str);  // prints pippo pluto

现在我想以同样的方式从Swift访问它,但我的指针有问题。 我试过这种方式:

    var opaque = COpaquePointer.null()   // create a new opaque pointer pointing to null
    FLSwiftUtils.writeString(&opaque)
    println(opaque)

但它打印VSs14COpaquePointer(有1个孩子),因为opaque是一个指针,我不明白如何顺从它并访问指向的NSMutableString

如果我尝试,则从不透明值开始创建UnsafePointer:

    var str = UnsafePointer<NSMutableString>(opaque)
    println(str)

println打印一个空行

我甚至试过这个:

    var secondStr = AutoreleasingUnsafePointer<NSMutableString>(opaque.value)
    println(secondStr)
    println(secondStr.memory)

但打印

VSs26AutoreleasingUnsafePointer(有1个孩子) __NSCFString

我认为我接近解决方案,但我确定我做错了什么。

1 个答案:

答案 0 :(得分:0)

我在Apple论坛上收到了答案(注意:此代码为FOR ARC)

+ (void)writeString:(void **)var
{
    NSMutableString *aString = [[NSMutableString alloc] initWithFormat:@"pippo %@", @"pluto"];  // this is autoreleased by ARC

    *var = (void *)CFBridgingRetain(aString);   // send a retain, the release will be sent at the swift side
}

然后就像这样将它释放到Swift中:

    var opaque = COpaquePointer.null()   // create a new opaque pointer pointing to null
    TestClass.writeString(&opaque)

    var string = Unmanaged<NSString>.fromOpaque(opaque).takeRetainedValue()  // this function: creates an object, from the opaque pointer "opaque", take it's value and balance it with a release
    println(string)