使用Xcode 9.4.1构建Mac应用程序时崩溃,使用Xcode 8.3.3构建的Mac应用程序运行良好

时间:2018-10-12 09:35:37

标签: objective-c xcode macos

我试图迁移到Mojave上的Xcode 10,这是从High Sierra上的Xcode 8.3.3来的。我有一个相当大的应用程序,其中包含相当多的旧版(非ARC)代码。该应用程序当前可在Mac App Store中使用,该应用程序在High Sierra上以8.3.3构建。

我在使用Xcode 10和Mojave时遇到了问题,这使我陷入了困境,因此我决定备份并将迁移一次限制为一个步骤。我目前正在尝试(未成功)在High Sierra上使用Xcode 9.4.1进行构建和运行。

使用完全相同的代码库(新的repo签出),我的应用程序使用Xcode 8.3.3构建并正常运行。使用9.4.1可以正常运行,但是在运行时会崩溃。

问题似乎与内存/引用计数有关。当应用尝试显示窗口时,我总是崩溃,并且跟踪不是很有用。运行时调试输出始终表明我正在向已释放对象发送消息。这是典型的堆栈跟踪:

stack trace

每当应用尝试显示窗口时,我都会收到诸如(旧的收藏夹)“发送到已释放实例的消息”之类的消息。我并不总是将接收器视为我的特性之一,因此看起来这只是一种症状,而不是原因。这是一条典型的消息: ***-[NSCalibratedRGBColor版本]:消息发送到已释放实例0x60000605ce60

我试图从Xcode的诊断中获取任何东西都是徒劳的,例如僵尸和malloc涂鸦。无线电沉默。静态分析仪也报告没有问题。 我能想到的是,Xcode 9在某种程度上对待手动引用计数有所不同。我已经检查了所有构建标记,以查看Xcode 9是否更改了任何内容。没有变化。我已经查看了发行说明,找不到提及引用计数的更改。

我可以通过注释掉各种面板和窗口的显示来解决问题,但是崩溃总是采用相同的形式。

还有其他人遇到类似问题并找到解决方案吗? Xcode 9是否缺少某些内容?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

感谢@sdarlington和Willeke提供非常有用的答案。我终于找到并解决了问题。我确实必须使用穴居人的方法并逐渐从崩溃的窗口中删除内容(正如您正确地标识了Stephen一样)。事实证明,这是一个遗留的保留/发布问题,Xcode的诊断程序都没有发现这一问题。 我继承了一个不使用ARC的旧图形框架。它声明这样的ivars:

@interface ColourFiller : NSObject
{
    NSColor*            m_PrimaryColour;
    NSColor*            m_SecondaryColour;
}
...
@end

然后在其init方法中将它们设置如下:

m_PrimaryColour = [NSColor colorWithCalibratedRed:1 green:1 blue:1 alpha:1];
m_SecondaryColour = [NSColor colorWithCalibratedRed:0 green:0 blue:0 alpha:1];

请注意缺少手动保留。 所以我加了一个,一切都很好:

m_PrimaryColour = [[NSColor colorWithCalibratedRed:1 green:1 blue:1 alpha:1] retain];
m_SecondaryColour = [[NSColor colorWithCalibratedRed:0 green:0 blue:0 alpha:1] retain];

我不知道为什么Xcode没有标记这个,或者实际上为什么所有以前的build / xcode版本都运行良好。多年来,这种代码一直很高兴地没有出现任何症状。 Apple必须在Xcode 9中进行了一些库更改,最终将其公开。

再次感谢您的帮助-我现在可以进入Xcode 10和Mojave。