2010-02-13 46 views
3

当我尝试使用NSImage中的imageFromRect裁剪图像,我得到一个EXEC_BAD_ACCESS崩溃时约50%。这是在启动时运行的(在awakeFromNib中触发的),所以环境不应该改变。我不知道它为什么会崩溃一个启动而不是另一个。当我裁剪图像之前设置了断点时,我可以看到图像正确地从文件加载,并且似乎具有适当的尺寸。有什么建议?NSImage中轰然作物

这里是堆栈跟踪:

#0 0x97bb58c2 in ripc_RemoveEntry 
#1 0x97b927b0 in ripc_AcquireImage 
#2 0x97b903be in ripc_DrawImage 
#3 0x930f9384 in CGContextDrawImage 
#4 0x9463159f in __-[NSBitmapImageRep draw]_block_invoke_1 
#5 0x9448e74b in __-[NSBitmapImageRep _performBlockUsingBackingCGImage:]_block_invoke_1 
#6 0x94365232 in -[NSBitmapImageRep _performBlockUsingBacking:] 
#7 0x9448e6b3 in -[NSBitmapImageRep _performBlockUsingBackingCGImage:] 
#8 0x9462f87f in -[NSBitmapImageRep draw] 
#9 0xb0006a03 in -[NSImage(Crop) imageFromRect:] at ThemeManager.m:325 
#10 0xb000820a in -[FrameImages setImage:] at ThemeManager.m:270 
#11 0xb0005f21 in -[ThemeManager setImage:forTheme:] at ThemeManager.m:63 
#12 0xb0006397 in +[ThemeManager defaultThemeManager] at ThemeManager.m:39 
#13 0xb0005b33 in -[SCThemedView layoutContentView] at SCThemedView.m:92 
#14 0x9435ebaf in -[NSNibOutletConnector establishConnection] 
#15 0x9435d33b in -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] 
#16 0x9435b450 in loadNib 
#17 0x9435a848 in +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] 
#18 0x9435a759 in +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:] 
#19 0x9435a6a4 in +[NSBundle(NSNibLoading) loadNibNamed:owner:] 
#20 0x943574a9 in NSApplicationMain 
#21 0x0000256a in start 
+0

你可能需要从发布您的代码 - [NSImage中(作物)imageFromRect:]。此外,该方法名称过于通用,无法在没有前缀的类别中添加。 – Ken 2010-02-13 08:02:40

回答

0

向我们展示你是如何加载图像。这种崩溃通常是在完成之前释放对象的结果。

+0

这是一个垃圾回收应用程序。我没有对指针做任何奇怪的事情,所以它不应该太快释放。 – Bridgeyman 2010-02-13 05:22:39

0

有堆栈跟踪中没有awakeFromNib;相反,看起来在nib加载程序仍在进行连接([NSNibOutletConnector establishConnection])时发生崩溃,这意味着绘图环境可能尚未正确设置。

尝试将SCThemedView的layoutContentView方法移动到SCThemedView的awakeFromNib的ThemeManager设置代码(无论是打电话给[ThemeManager defaultThemeManager])。

如果还是不行,请尝试延缓所有ThemeManager layout /绘图直到的NSApplication的applicationDidFinishLaunching:方法被调用后。