(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
是否必须转换为 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
并且它工作正常,除了 [=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 接口。
我对这个函数有疑问:
- (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
并且它工作正常,除了 [=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 接口。