在loadNib()期间自动释放NSScreen

时间:2013-05-30 02:25:52

标签: cocoa autorelease

我是OSX开发人员。我遇到的问题描述如下:

- (void)method1:(NSObject *)arg1
       contextInfo:(NSObject *)arg2
{
   ...
   [self method2:arg1
             screen:[self.windowController window].screen];
   ...
}

- (void)method2:(NSObject *)arg1
            screen:(NSScreen *)screen
{
   ...
   MyWindowController *myWindowController =
      [[MyWindowController alloc] initWithWindowNibName:@"MyWindow"];
   NSWindow *aWindow = [MyWindowController window];   // A Problem happens
   ...
}

执行“A Problem occurred”后,我发现屏幕内容(即*屏幕)发生了变化。

(gdb) p *screen
$15 = {
  <NSObject> = {
    isa = 0x7fff788a6598        xxxxxxxx changed
  }, 
  members of NSScreen: 
  _frame = {
    origin = {
      x = -4353346,              xxxxxxx changed
      y = -234234
    }, 
    size = {
      width = -35252435,             xxxxxxxx changed
      height = -3452663,              xxxxxxxx changed
    }
  }, 
  _depth = 520, 
  _screenNumber = 2077752383, 
  _auxiliaryStorage = 0x0
}

一开始,我认为可能存在堆栈溢出或内存损坏导致此问题。但后来我用gdb来观察*屏幕何时被更改。而且我也认为可能是由于内存损坏,屏幕已经意外释放。所以我也看了屏幕和*屏幕。但我得到的只是:

(请原谅我已经更改了一些日志,因为我无法在这里发布部分代码。)

#0 0x00007fff8427824f in objc_msgSend () 
#1 0x00007fff8c5748e4 in -[NSScreen dealloc] () 
#2 0x00007fff8581528a in CFRelease () 
#3 0x00007fff85852efc in -[__NSArrayI dealloc] () 
#4 0x00007fff8427c230 in (anonymous namespace)::AutoreleasePoolPage::pop () 
#5 0x00007fff8583cd72 in _CFAutoreleasePoolPop () 
#6 0x00007fff8c07c172 in loadNib () 
#7 0x00007fff8c07b88c in +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] () 
#8 0x00007fff8c1ce5bc in +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:] () 
#9 0x00007fff8c20160b in -[NSWindowController loadWindow] () 
#10 0x00007fff8c2012e5 in -[NSWindowController window] () 
#11 0x000000010003c3c9 in -[SessionListener method2:screen:] (self=0x10220caa0, _cmd=0x100261922, arg1=0x10209ede0, screen=0x1020b7d20) at SessionListener.m:307 
#12 0x000000010003d3f4 in -[SessionListener method1:contextInfo:] (self=0x10220caa0, _cmd=0x1002618a0, arg1=0x10206b950, arg2=0x0) at SessionListener.m:457

rwatch和watch是在方法2执行的最开始设置的。 然后我在执行“A Problem happen”行并执行上面的堆栈跟踪时获得了第一个休息时间。

从我的观察来看,窗口的加载似乎触发了释放NSScreen的自动释放循环。 但我没有做任何像自动释放池排放或释放的事情。所以我想知道为什么会这样。

最后一点是,这个问题并不总是发生。在我的13和15英寸视网膜MBP(OSX 10.8.2)上重现这个问题非常容易,但不能在我的其他13英寸MBP非视网膜(OSX10.8.2)上重现。

是否有人发表评论?

由于

0 个答案:

没有答案