(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
是否必须转换为 Pointer 或 NSString ?
在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 函数?