objective-c - 为什么 [NSTextStorage setAttributedString] 与 NSMutableAttributedString 崩溃?

标签 objective-c macos cocoa

当我运行以下代码时,它在最后一行崩溃。我不知道为什么。此函数在 awakeFromNib 中被调用。

- (void)setMotdText:(NSString *)text
{
    NSString *boldFontName = [[NSFont boldSystemFontOfSize:12] fontName];
    NSMutableAttributedString *attrstr = [[NSMutableAttributedString alloc] initWithString:text];

    [attrstr beginEditing];

    [attrstr addAttribute:NSFontAttributeName value:boldFontName range:NSMakeRange(0, 16)];

    [attrstr endEditing];

    [self.motdTextView.textStorage setAttributedString:attrstr];
}

我得到这个崩溃日志:

2012-06-22 11:32:22.348 MSM-Plan[20785:403] -[__NSCFConstantString _isDefaultFace]: unrecognized selector sent to instance 0x7fff79b9f380
2012-06-22 11:32:22.349 MSM-Plan[20785:403] An uncaught exception was raised
2012-06-22 11:32:22.349 MSM-Plan[20785:403] -[__NSCFConstantString _isDefaultFace]: unrecognized selector sent to instance 0x7fff79b9f380
2012-06-22 11:32:22.351 MSM-Plan[20785:403] (
    0   CoreFoundation                      0x00007fff8a5bef56 __exceptionPreprocess + 198
    1   libobjc.A.dylib                     0x00007fff8ae19d5e objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff8a64b1be -[NSObject doesNotRecognizeSelector:] + 190
    3   CoreFoundation                      0x00007fff8a5abe23 ___forwarding___ + 371
    4   CoreFoundation                      0x00007fff8a5abc38 _CF_forwarding_prep_0 + 232
    5   AppKit                              0x00007fff8e0b060c -[NSMutableAttributedString(NSMutableAttributedStringKitAdditions) fixFontAttributeInRange:] + 1249
    6   AppKit                              0x00007fff8e0afeb7 -[NSMutableAttributedString(NSMutableAttributedStringKitAdditions) fixAttributesInRange:] + 64
    7   AppKit                              0x00007fff8e19b521 -[NSTextStorage processEditing] + 107
    8   AppKit                              0x00007fff8e0c2564 -[NSTextStorage edited:range:changeInLength:] + 385
    9   Foundation                          0x00007fff8d6f4497 -[NSConcreteMutableAttributedString replaceCharactersInRange:withAttributedString:] + 328
    10  AppKit                              0x00007fff8e1dfd19 -[NSConcreteTextStorage replaceCharactersInRange:withAttributedString:] + 81
    11  MSM-Plan                            0x000000010206af5a -[MSM_PlanAppDelegate setMotdText:] + 314
    12  MSM-Plan                            0x000000010206c455 -[MSM_PlanAppDelegate awakeFromNib] + 1701
    13  CoreFoundation                      0x00007fff8a5b5fb1 -[NSObject performSelector:] + 49
    14  CoreFoundation                      0x00007fff8a5b5f32 -[NSSet makeObjectsPerformSelector:] + 274
    15  AppKit                              0x00007fff8e0369ff -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1245
    16  AppKit                              0x00007fff8e02cf73 loadNib + 322
    17  AppKit                              0x00007fff8e02c470 +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] + 217
    18  AppKit                              0x00007fff8e02c38b +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:] + 141
    19  AppKit                              0x00007fff8e02c2ce +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 364
    20  AppKit                              0x00007fff8e29d06f NSApplicationMain + 398
    21  MSM-Plan                            0x000000010206adf2 main + 34
    22  MSM-Plan                            0x000000010206adc4 start + 52
)
2012-06-22 11:32:22.416 MSM-Plan[20785:403] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString _isDefaultFace]: unrecognized selector sent to instance 0x7fff79b9f380'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff8a5bef56 __exceptionPreprocess + 198
    1   libobjc.A.dylib                     0x00007fff8ae19d5e objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff8a64b1be -[NSObject doesNotRecognizeSelector:] + 190
    3   CoreFoundation                      0x00007fff8a5abe23 ___forwarding___ + 371
    4   CoreFoundation                      0x00007fff8a5abc38 _CF_forwarding_prep_0 + 232
    5   AppKit                              0x00007fff8e0b060c -[NSMutableAttributedString(NSMutableAttributedStringKitAdditions) fixFontAttributeInRange:] + 1249
    6   AppKit                              0x00007fff8e0afeb7 -[NSMutableAttributedString(NSMutableAttributedStringKitAdditions) fixAttributesInRange:] + 64
    7   AppKit                              0x00007fff8e19b521 -[NSTextStorage processEditing] + 107
    8   AppKit                              0x00007fff8e0c2564 -[NSTextStorage edited:range:changeInLength:] + 385
    9   Foundation                          0x00007fff8d6f4497 -[NSConcreteMutableAttributedString replaceCharactersInRange:withAttributedString:] + 328
    10  AppKit                              0x00007fff8e1dfd19 -[NSConcreteTextStorage replaceCharactersInRange:withAttributedString:] + 81
    11  MSM-Plan                            0x000000010206af5a -[MSM_PlanAppDelegate setMotdText:] + 314
    12  MSM-Plan                            0x000000010206c455 -[MSM_PlanAppDelegate awakeFromNib] + 1701
    13  CoreFoundation                      0x00007fff8a5b5fb1 -[NSObject performSelector:] + 49
    14  CoreFoundation                      0x00007fff8a5b5f32 -[NSSet makeObjectsPerformSelector:] + 274
    15  AppKit                              0x00007fff8e0369ff -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1245
    16  AppKit                              0x00007fff8e02cf73 loadNib + 322
    17  AppKit                              0x00007fff8e02c470 +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] + 217
    18  AppKit                              0x00007fff8e02c38b +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:] + 141
    19  AppKit                              0x00007fff8e02c2ce +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 364
    20  AppKit                              0x00007fff8e29d06f NSApplicationMain + 398
    21  MSM-Plan                            0x000000010206adf2 main + 34
    22  MSM-Plan                            0x000000010206adc4 start + 52
)
terminate called throwing an exception(lldb)

有人有想法吗?如果我用 NSAttributedString-Object 调用它,就没有错误。

最佳答案

我必须将第一行更改为:

    NSFont *boldFont = [NSFont boldSystemFontOfSize:12];

现在它可以工作了,因为 value 属性需要一个 NSFont-Object 而不是带有字体名称的 NSString。

这是工作代码:

- (void)setMotdText:(NSString *)text
{
    NSFont *boldFont = [NSFont boldSystemFontOfSize:12];
    NSMutableAttributedString *attrstr = [[NSMutableAttributedString alloc] initWithString:text];

    [attrstr beginEditing];

    [attrstr addAttribute:NSFontAttributeName value:boldFont range:NSMakeRange(0, 16)];

    [attrstr endEditing];

    [self.motdTextView.textStorage setAttributedString:attrstr];
}

关于objective-c - 为什么 [NSTextStorage setAttributedString] 与 NSMutableAttributedString 崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11153810/

相关文章:

objective-c - 更新到 macOS 后出现关于 "dynamic accessors failing"的未知错误

macos - 让 NSTextField 随自动布局中的文本一起增长?

Cocoa:创建自定义 TextView

cocoa 实用类

iphone - OpenCV iPhone 相机,更改 CV_CAP_PROP_IOS_DEVICE_ * 没有效果

iphone - 有没有办法在iOS上以编程方式安排事件?

Objective-c:NSButton setAction 不工作

ios - 如何获取货币符号

iphone - 带有帧数组的 CABasicAnimation

c++ - 有什么方法可以使用类的成员函数在并发线程中运行而无需在 C++11 中传递 *this 吗?