(NSString *) 它是帕斯卡指针还是 NSString?

Posted

技术标签:

【中文标题】(NSString *) 它是帕斯卡指针还是 NSString?【英文标题】:(NSString *) it's in pascal a pointer or a NSString? 【发布时间】:2017-07-30 16:30:58 【问题描述】:

我对此功能有疑问:

- (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-15717 和 http://delphiworlds.com/2016/07/region-monitoring-background-ios/

【问题讨论】:

我没有 iOS 9 设备,但它不适用于我的 iOS 9(64 位),这就是我必须更改它的原因。也很确定它是 iOS 9.3,因为我在 2016 年 7 月遇到了问题,而 9.3 于 2016 年 3 月发布 嗯所以也许它连接到编译器?我在 32 位以下,而不是 64 位 是的,它已连接到编译器(64 位),请参阅 horacio 的答案 【参考方案1】:

这是一个 Objective-C 桥接问题,它在 32 位支持下运行良好,CLRegion 的标头翻译是正确的。问题是桥不能正确工作以支持 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)。谢谢你:)

【讨论】:

很高兴你喜欢,@Jack:D 谢谢你的提示,@DalijaPrasnikar 谢谢,@HorácioFilho @DaveNottage 很高兴你喜欢 :)

以上是关于(NSString *) 它是帕斯卡指针还是 NSString?的主要内容,如果未能解决你的问题,请参考以下文章

在Object-C 中的 NSArray,NSString…… NS到底是啥??

NSString应该用strong还是weak,SDWebIamge原理以及相关问题

如何检查 NS String 是不是包含 javascript 函数?

在 Xcode Playground 中将 NSString 转换为 CString

NS3-对象框架之智能指针

从'NSInteger'(又名'int')分配给'NSString *'的不兼容整数到指针转换;