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

Objective c Mac应用程序在使用Xcode 9.4.1构建时崩溃,在使用Xcode 8.3.3构建时运行良好,objective-c,xcode,macos,Objective C,Xcode,Macos,我正在尝试在Mojave上使用Xcode 10,这是因为在High Sierra上使用了Xcode 8.3.3。我有一个相当大的应用程序,包含相当多的遗留(非ARC)代码。该应用程序目前在Mac应用程序商店中运行,在High Sierra上使用8.3.3构建 我遇到了Xcode 10和Mojave的问题,这让我陷入了一个兔子洞,所以我决定备份并限制迁移一次只进行一步。我目前正在尝试(未成功)在High Sierra上使用Xcode 9.4.1构建和运行 使用完全相同的代码库(新的回购签出),我的

我正在尝试在Mojave上使用Xcode 10,这是因为在High Sierra上使用了Xcode 8.3.3。我有一个相当大的应用程序,包含相当多的遗留(非ARC)代码。该应用程序目前在Mac应用程序商店中运行,在High Sierra上使用8.3.3构建

我遇到了Xcode 10和Mojave的问题,这让我陷入了一个兔子洞,所以我决定备份并限制迁移一次只进行一步。我目前正在尝试(未成功)在High Sierra上使用Xcode 9.4.1构建和运行

使用完全相同的代码库(新的回购签出),我的应用程序使用Xcode 8.3.3构建并运行良好。它使用9.4.1构建良好,但在运行时崩溃

问题似乎与内存/引用计数有关。当应用程序试图显示一个窗口时,我总是会崩溃,而跟踪不是很有用。运行时调试输出一致地指示我正在向解除分配的对象发送消息。下面是一个典型的堆栈跟踪:

每当应用程序尝试显示窗口时,我都会收到诸如(旧收藏夹)“message sent to deallocated instance”之类的消息。我并不总是认为接收器是我的财产之一,所以看起来这只是一种症状,而不是原因。以下是一条典型的信息: ***-[NSCalibratedRGBColor release]:发送到解除分配实例0x60000605ce60的消息

我试图从Xcode的诊断中得到任何东西都是徒劳的,比如僵尸和malloc scribble。无线电沉默。静态分析仪也报告没有问题。 我所能想到的是,手动引用计数在某种程度上被Xcode 9区别对待。我已经检查了所有的构建标志,看看Xcode 9是否改变了什么。没有变化。我检查了发行说明,没有发现引用计数的变化

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


还有其他人遇到过类似的问题并找到了解决方案吗?我是否遗漏了Xcode 9的某些内容?非常感谢您的帮助。

感谢@sdarlington和Willeke提供了非常有用的答案。我终于找到并解决了这个问题。我确实不得不使用穴居人的方法,逐渐地从一扇破碎的窗户上移除东西(正如你正确地识别斯蒂芬的那样)。事实证明,这是一个遗留的保留/发布问题,Xcode的诊断都没有发现。 我继承了一个不使用ARC的旧图形框架。它这样声明IVAR:

@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没有标记这个,或者确实不知道为什么所有以前的构建/Xcode版本都运行良好。这个代码已经愉快地存在了多年,没有任何症状。苹果在Xcode 9中进行了一些库更改,最终暴露了它


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

如果堆栈跟踪具有代表性,则说明您的故事板/XIB文件有问题。我认为当你评论各种面板/窗口时,你的思路是正确的。同样值得仔细检查你的推荐信是否强/弱。请看这里:您是否创建了一个新的Xcode项目?哪个SDK与Xcode 8和9一起使用?可能相关:“如果您的应用程序链接在macOS 10.13 SDK或更高版本上,则在中订购的NSWindows将被AppKit强烈引用,直到它们被明确订购或关闭(不包括隐藏或最小化操作)。这意味着,通常不会释放屏幕上的窗口(并作为解除分配的副作用关闭/订购)。”