Objective c 使用**void参数从swift访问目标c函数
这主要是一个“学术”问题,所以请不要问“你为什么需要这样做”:-) 我有这个objective c方法,我没有使用ARC(我知道如果我不释放分配的字符串,它会泄漏)。 此方法获取指向内存中某个内容的指针,然后将指向的内容更改为NSMutableStringObjective c 使用**void参数从swift访问目标c函数,objective-c,swift,Objective C,Swift,这主要是一个“学术”问题,所以请不要问“你为什么需要这样做”:-) 我有这个objective c方法,我没有使用ARC(我知道如果我不释放分配的字符串,它会泄漏)。 此方法获取指向内存中某个内容的指针,然后将指向的内容更改为NSMutableString +(void) writeString:(void **)var { NSMutableString *aString = [[NSMutableString alloc] initWithFormat:@"pippo %@", @"
+(void) writeString:(void **)var
{
NSMutableString *aString = [[NSMutableString alloc] initWithFormat:@"pippo %@", @"pluto"];
*var = aString;
}
从目标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(有一个子对象),因为不透明
是一个指针,我不知道如何遵从它并访问指向的NSMutableString
如果尝试从不透明值开始创建非安全指针:
var str = UnsafePointer<NSMutableString>(opaque)
println(str)
var str=UnsafePointer(不透明)
println(str)
println打印一个空行
我甚至试过:
var secondStr = AutoreleasingUnsafePointer<NSMutableString>(opaque.value)
println(secondStr)
println(secondStr.memory)
var secondStr=AutoreleasingUnsafePointer(不透明的.value)
println(secondStr)
println(第二个str.内存)
但它会打印出来
VSs26AutoreleasingUnsafePointer(有1个子项)
__NSCFString
我想我已经接近解决方案了,但我肯定我做错了什么 我在苹果论坛上收到了答案(注:此代码用于ARC) 然后将其释放到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)
var opaque=COpaquePointer.null()//创建一个指向null的新不透明指针
TestClass.writeString(&不透明)
var string=Unmanaged.fromovaque(不透明).takeRetainedValue()//此函数:从不透明指针“不透明”创建一个对象,获取它的值并用释放来平衡它
println(字符串)
这可能对您有用:它没有帮助……我使用的是void**,而不是void*:-/
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)