这主要是一个“学术”问题,所以请不要问“你为什么要这样做”: - )
我有这个客观的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
我认为我接近解决方案,但我确定我做错了什么。
答案 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)