(NSString*)在Pascal中是指针还是NSString?

4

我有一个疑问,关于这个函数:

- (instancetype)initWithCenter:(CLLocationCoordinate2D)center
                            radius:(CLLocationDistance)radius
                        identifier:(NSString *)identifier;

在Pascal中,identifier:(NSString *)identifier必须转换为Pointer还是NSString
在Delphi源代码中,此函数的转换如下:
function initWithCenter(center: CLLocationCoordinate2D; radius: CLLocationDistance; identifier: NSSTRING): Pointer; cdecl;

然而,当我使用它时,在iOS 10上出现了一个AV(但在iOS 9上可以工作):(
如果我将NSString替换为Pointer,则它在IOS 10上工作,但我不明白为什么...
注意:这非常奇怪,因为在Delphi中,每个(NSString *)都被翻译为NSString,并且它运行良好,除了CLRegion.initCircularRegionWithCenter(在iOS10/64位下),我真的想知道为什么。https://quality.embarcadero.com/browse/RSP-15717http://delphiworlds.com/2016/07/region-monitoring-background-ios/

我不再拥有iOS 9设备了,然而在我的iOS 9(64位)上它并没有工作,这就是为什么我不得不更换它的原因。我相当确定它是iOS 9.3,因为我在2016年7月遇到了这个问题,而9.3是在2016年3月发布的。 - Dave Nottage
嗯,也许这与编译器有关?我使用的是32位的操作系统,而不是64位的。 - user8371791
是的,它连接到编译器(64位),请参考Horacio的答案。 - user8371791
1个回答

6
这是一个Objective-C桥接问题,在32位支持方面工作正常,但CLRegion的头文件翻译是正确的。问题在于,该桥接不适用于64位支持,因为32位和64位支持的Objective-C Runtime ABI不同。为了澄清,正确的使用方法是NSString:),桥接将负责提取句柄(由Objective-C Runtime创建的对象的指针),这是传递给Objective-C Runtime的信息。在当前设计中,句柄提取是通过以下方式完成的:
Handle := (DelphiObject as ILocalObject).GetObjectID

或者从 Macapi.Helpers.pas 调用以下函数:

function NSObjectToID(const AObject: NSObject): Pointer;

Dave Nottage的建议可行,因为现在您正在绕过提取句柄的桥梁的工作,并直接传递它。 这正是桥梁无法完成其工作的地方。我们不需要转到低级别 Pointer 类型,对于我们的桥梁,Delphi相当于Objective-C的 NSString * NSString 接口。

有关更多详细信息,请参见(https://quality.embarcadero.com/browse/RSP-15717)。谢谢 :)


很高兴你喜欢,@Jack :D - Horácio Filho
谢谢您的提示,@DalijaPrasnikar。 - Horácio Filho
谢谢,@HorácioFilho - Dave Nottage
@DaveNottage 很高兴你喜欢 :) - Horácio Filho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接