【问题标题】:Access from swift to objective c function with a **void parameter使用 **void 参数从 swift 访问目标 c 函数
【发布时间】:2014-06-06 11:40:39
【问题描述】:

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

我有这个客观的 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

我想我已经接近解决方案了,但肯定我做错了什么。

【问题讨论】:

标签: objective-c swift


【解决方案1】:

我在 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 2014-07-11
    • 2016-12-30
    • 2017-07-13
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    相关资源
    最近更新 更多