【问题标题】:Intermittent crash during NSMutableAttributedString setupNSMutableAttributedString 设置期间的间歇性崩溃
【发布时间】:2012-05-12 21:49:40
【问题描述】:

我有一些代码来设置 NSMutableAttributedString:

    NSMutableParagraphStyle *centred = [[NSMutableParagraphStyle alloc]init];
    [centred setAlignment:NSCenterTextAlignment];
    NSDictionary *attributes = [[NSDictionary alloc]initWithObjectsAndKeys:[NSFont fontWithName:@"Helvetica bold" size:12],NSFontAttributeName,
                                [NSColor whiteColor],NSForegroundColorAttributeName,
                                [NSColor clearColor], NSBackgroundColorAttributeName, 
                                centred, NSParagraphStyleAttributeName,
                                nil];
    NSMutableAttributedString* attribTitle = [[NSMutableAttributedString alloc]initWithString:@"Foo"];
    [attribTitle setAttributes:attributes range:NSMakeRange(0, [[attribTitle string] length] - 1)];

几乎自从我开始该项目以来,它一直存在于我的应用程序的 -awakeFromNib 方法中,没有任何问题,但就在今天,我开始尝试在 Xcode 4.3 中运行该应用程序的所有其他尝试,但由于“线程 1:EXC_BAD_ACCESS(代码=1,地址=0x10)”。它在最后的 '...setAttributes...' 行中断。有一次,我尝试使用 initWithString:attributes: 方法来初始化 attribTitle,果然崩溃(当它发生时)在 alloc-init 行。

我已经尝试清除 Xcode 重新启动,但它仍然会发生在所有其他构建中...如果应用程序没有崩溃,那么 attrbibuted 字符串会按预期显示。

我想知道我是否有一个损坏的项目文件,但以防万一我做了一些愚蠢的事情,谁能指出一个错误 - 大概是在“属性”NSDictionary 中?

谢谢!

托德。

【问题讨论】:

  • 如果你这样初始化段落样式会发生什么:NSMutableParagraphStyle *centred = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];?
  • 另一个问题可能是您命名字体的方式。尝试破解该代码并测试您的字体是否为零。
  • 对于它的价值,我在一个工作项目中尝试了你的代码,到目前为止在 OS X SDK 10.7 上没有崩溃。根据 Wienke 的建议,我尝试按原样记录字体,结果如下:"Helvetica-Bold 12.00 pt. P [] (0x7ff6734f3f40) fobj=0x7ff6736d0190, spc=3.33" -- 也没有问题。
  • 谢谢你们! modocache,我得到和你一样的 o/p - 感谢您抽出宝贵的时间。 Wienke,我尝试了您的建议,并且 -defaultParagraphStyle 确实有所作为:现在我得到一个“[* count] 无法识别的选择器发送到实例...”,其中 '*' 可以是 NSURL 或 NSCFString。虽然我在 -awakeFromNib 中有一个 NSArray,但它并没有被“计数”……我正在使用这段代码来格式化 NSButton 标题。如果我完全删除它,该应用程序似乎会一次又一次地运行。我只是在错误的地方初始化了 var 吗?
  • 好遗憾:我安装了两个版本的 Xcode,4.2 和 4.3。当我升级到 10.7 时它被留下了!!这将解释项目设置的事情。我运行多个帐户(我喜欢故意让自己的事情变得困难),我敢打赌我在 4.2 中打开了该项目几次。如果全新安装不起作用,我会重新发布。

标签: objective-c macos xcode4


【解决方案1】:

这是您运行的代码吗,是否简化了?事实上,对我来说它看起来不错(我敢说)。当它每隔一次崩溃时,这表明其他情况,这在此处的代码中不可见。

你提到这是在-awakeFromNib: 中——这个方法有可能运行两次吗?我有很多次让我感到困惑,而且它很容易发生在例如您在 MainMenu.xib 中创建一个窗口控制器作为 IB 对象,然后说窗口控制器通过 -[super initWithWindowNibName:] 在它自己的 -init: 中加载一个 NIB。这会为每个涉及的 NIB 调用一次 -awakeFromNib。在我的案例中,我创建了一些初始化问题的顺序,这显示出与您描述的类似的未确定行为。

我将代码移至-windowWillLoad-windowDidLoad 方法,这是每个窗口的,因此没有这个问题。

【讨论】:

  • 非常感谢你,febeling。好像就是这样!我确实,愚蠢地将一个 NSObject 实例错误地留在了一个 nib 文件中。我现在已经运行了 10 次或更多次,一切似乎都很好!顺便说一句:重新安装 Xcode 似乎也解决了项目设置更新问题,所以也许你有我所做的,即 Xcode 4.2 和 4.3 在同一台机器上。我机器上的 Spotlight 似乎混合了两个版本,所以有时我运行的是 4.2。
  • 嘿,很高兴听到这个消息! :) 我会在这里检查 Xcode 版本。
猜你喜欢
  • 2013-06-14
  • 2012-12-31
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 2015-05-21
  • 2014-09-15
  • 2021-03-31
相关资源
最近更新 更多