gpt4 book ai didi

xcode - 为什么 NSFontManager.availableMembers(ofFontFamily :) crashing in Xcode 8 GM?

转载 作者:行者123 更新时间:2023-12-03 11:33:29 26 4
gpt4 key购买 nike

我在 Xcode 8 Beta 6 (8S201h) 中写了这个:

guard let faceMembers = NSFontManager.shared().availableMembers(ofFontFamily: familyName ?? fontName) else { return nil }

而且效果很好。现在我已经升级到 Xcode 8 GM Seed (8A218a) Xcode 8 (8A218a),它崩溃了 (EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0))。

使用调试器缩小它的范围,我发现 NSFontManager.availableMembers(ofFontFamily:) 中的某些东西真的很讨厌这个,因为无论我放在那里它都会崩溃,即使是普通的(绝对是安装!)像 Helvetica Neue 这样的字体。

(lldb) po NSFontManager.shared()
<NSFontManager: 0x6100000a24c0>

(lldb) po familyName
▿ Optional<String>
- some : "Helvetica Neue"


(lldb) po fontName
"HelveticaNeue"


(lldb) po NSFontManager.shared().availableMembers(ofFontFamily: familyName ?? fontName)
error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
The process has been returned to the state before expression evaluation.
(lldb) po NSFontManager.shared().availableMembers(ofFontFamily: familyName!)
error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
The process has been returned to the state before expression evaluation.
(lldb) po NSFontManager.shared().availableMembers(ofFontFamily: "Not a real font?!")
nil

因此,当我向它传递一个有效的字体系列名称时,它会崩溃...但是当我向它传递一个假的字体系列名称时,它会返回 nil

这是我可以解决的问题,还是只是 Xcode 8 GM Seed Xcode 8 的问题,将在 SDK 更新中解决?


查看崩溃日志后,我看到了这个可疑之处:

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libswiftFoundation.dylib 0x0000000107cbb249 _TZFE10FoundationSa26_forceBridgeFromObjectiveCfTCSo7NSArray6resultRGSqGSax___T_ + 153
1 libswiftCore.dylib 0x00000001079031f3 swift_dynamicCast + 1635
2 libswiftCore.dylib 0x000000010790448b _dynamicCastFromExistential(swift::OpaqueValue*, swift::OpaqueValue*, swift::TargetExistentialTypeMetadata<swift::InProcess> const*, swift::TargetMetadata<swift::InProcess> const*, swift::DynamicCastFlags) + 91
3 libswiftCore.dylib 0x0000000107903919 swift_dynamicCast + 3465
4 libswiftFoundation.dylib 0x0000000107d6a348 _TPA__TFFs15_arrayForceCastu0_rFGSax_GSaq__U_FQ_Q0_ + 56
5 libswiftFoundation.dylib 0x0000000107cbbc45 _TFEsPs10Collection3mapurfzFzWx8Iterator7Element_qd__GSaqd___ + 885
6 libswiftFoundation.dylib 0x0000000107cbb4c3 _TFs15_arrayForceCastu0_rFGSax_GSaq__ + 227
7 libswiftFoundation.dylib 0x0000000107cbb7a5 _TZFE10FoundationSa36_unconditionallyBridgeFromObjectiveCfGSqCSo7NSArray_GSax_ + 197

所以它似乎在 Swift-Foundation 中崩溃,在一些名为 _forceBridgeFromObjectiveC 的函数中...不确定这是否对任何人有帮助,但它确实确认它在 SDK/运行时中。

最佳答案

在此期间,我能弄清楚如何解决这个问题的唯一方法是在 objective-c 类中创建一个静态方法。然后,我将该 header 导入到我的桥接 header 中,并从 Swift 3 调用静态方法,它运行良好。

希望这能帮助您度过这些困难时期!

#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>

@interface WorkAround : NSObject

+ (NSArray *)typefacesForFontFamily:(NSString *)family;

@end


#import "WorkAround.h"

@implementation WorkAround

/// Returns an array of arrays, or nil, that contain information about
/// each typeface found for the specified font family.
+ (NSArray *)typefacesForFontFamily:(nonnull NSString *)family {
NSFontManager *fontManager = [NSFontManager sharedFontManager];
return [fontManager availableMembersOfFontFamily:family];
}
@end

关于xcode - 为什么 NSFontManager.availableMembers(ofFontFamily :) crashing in Xcode 8 GM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39395237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com