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

标签 ios objective-c delphi nsstring firemonkey

我对这个功能有疑问:

- (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 并且它工作正常,除了 CLRegion.initCircularRegionWithCenter(在 ios10/64 位下),我真的很想知道为什么。 https://quality.embarcadero.com/browse/RSP-15717http://delphiworlds.com/2016/07/region-monitoring-background-ios/

最佳答案

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

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 )。谢谢:)

关于ios - (NSString *) 它是指针还是 NSString?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45402118/

相关文章:

c++ - 如何使用 soxlib for iOS 去除开始和结束静音

ios - 如何为 NSURLconnection 或 NSURLSession 禁用 sslv3

objective-c - 无法使用文件路径实例化 NSURL

objective-c - 如何在代码中修改从库中拖动的 NSButton?

delphi - 如何检查是否引发TIdHTTP异常

javascript - Delphi 中的 AES 编码 XE4 Javascript 中的解码

iphone - 从 IO 单元将音频写入磁盘

iphone - 旋转后重新定位UIWindow

ios - 是否有任何免费的 iOS SDK 用于 syling map ?

delphi - 在Delphi中,有没有办法调整TMemo的行距?