(NSString *) 它是指针还是 NSString?

(NSString *) it's in pascal a pointer or a NSString?

我对这个函数有疑问:

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

在 Pascal 中,identifier:(NSString *)identifier 是否必须转换为 PointerNSString

在delphi源码中,这个函数是这样转换的:

function initWithCenter(center: CLLocationCoordinate2D; radius: CLLocationDistance; identifier: NSSTRING): Pointer; cdecl;

然而,当我使用它时,我在 ios 10 下有一个 AV(但它在 ios 9 上工作) :(

如果我用 Pointer 替换 NSString 那么它可以在 IOS 10 上工作,但我不明白为什么...

注意:这很奇怪,因为在 delphi 中每个 (NSString *) 都被翻译成 NSString 并且它工作正常,除了 [=15] =](在 ios10/64bit 下),我真的很想知道为什么。 https://quality.embarcadero.com/browse/RSP-15717 and http://delphiworlds.com/2016/07/region-monitoring-background-ios/

这是一个 Objective-C 桥接问题,它在 32 位支持下工作正常,CLRegion 的 header 翻译是正确的。问题是该桥无法正确支持 64 位,Objective-C 运行时 ABI 对于 32 位和 64 位支持是不同的。为了澄清起见,正确的用法是 NSString :),桥将负责提取句柄(指向由 Objective-C 创建的 object 的指针运行时)对你来说,它是传递给 Objective-C 运行时的信息,在当前设计中,句柄提取是通过以下方式完成的:

Handle := (DelphiObject as ILocalObject).GetObjectID

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

function NSObjectToID(const AObject: NSObject): Pointer;

Dave Nottage 的建议有效,因为您现在绕过了提取句柄的桥接工作,直接传递了它。这正是桥梁在其工作中失败的地方。我们不需要去low-levelPointer这里输入,对于我们的桥来说,Delphi相当于Objective-C的NSString *NSString 接口。

详情请见(https://quality.embarcadero.com/browse/RSP-15717)。谢谢:)