2010-12-07 21 views
1

什麼會導致我的程序在Xcode上暫停?我沒有設置斷點,當我執行我的代碼時,gdb提示符出現在命令行中。有沒有人對此有一個快速建議。 程序本身不會崩潰並返回正確的值。它只是不會停止執行。即使沒有設置斷點,GDB也會在XCode中暫停程序

告訴你我正在做什麼。我正在通過Objective-C 2.0書中的Stephen Kochan編程進行一些練習。發生這種情況的練習是8.6。練習要求創建一個簡單的方法,該方法將創建一個矩形對象,並在兩個其他矩形之間交叉數據。

我主要的樣子:

#import "Rectangle.h" 
#import "XYPoint.h" 
#import <stdio.h> 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    Rectangle *myRectangle = [[Rectangle alloc] init]; 
    XYPoint *myPoint = [[XYPoint alloc] init]; 
    Rectangle *secondRectangle = [[Rectangle alloc] init]; 
    XYPoint *secondPoint = [[XYPoint alloc] init]; 
    Rectangle *intersectRectangle; 

    [myRectangle setWidth:100 andHeight:180]; 
    [myPoint setX:400 andY:300]; 
    [myRectangle setOrigin:myPoint]; 

    [secondRectangle setWidth:250 andHeight:75]; 
    [secondPoint setX:200 andY:420]; 
    [secondRectangle setOrigin:secondPoint]; 

    intersectRectangle = [myRectangle intersect:secondRectangle]; 

    NSLog(@"Width: %i, Height: %i", intersectRectangle.width, intersectRectangle.height); 
    NSLog(@"With translated origin (%i, %i)", intersectRectangle.origin.x, intersectRectangle.origin.y); 

    [myRectangle release]; 
    [myPoint release]; 
    [secondRectangle release]; 
    [secondPoint release]; 
    [intersectRectangle release]; 
    [pool drain]; 
    return 0; 
} 

而對於像下面的類中的方法:

-(Rectangle *)intersect:(Rectangle *)rect{ 
    if (intersectingRect) { 
     [intersectingRect release]; 
    } 
    intersectingRect = [[Rectangle alloc] init]; 
    XYPoint *intersectPt = [[XYPoint alloc] init]; 
    int intersectWidth = 0; 
    int intersectHeight = 0; 
    int intersectX = 0; 
    int intersectY = 0; 

    if(origin.x < rect.origin.x) { 
     if ((origin.x + width) > rect.origin.x) { 
      if ((origin.x + width) > (rect.origin.x+rect.height)) { 
       if (origin.y < rect.origin.y) { 
        if ((origin.y+height) > rect.origin.y) { 
         if ((origin.y + height) > (rect.origin.y + rect.height)) { 
          intersectWidth = rect.width; 
          intersectHeight = rect.height; 
          intersectX = rect.origin.x; 
          intersectY = rect.origin.y; 
         } else { 
          intersectWidth = rect.width; 
          intersectHeight = origin.y + height - rect.origin.y; 
          intersectX = rect.origin.x; 
          intersectY = rect.origin.y; 
         } 
        } else { 
         intersectWidth = 0; 
         intersectHeight = 0; 
         intersectX = 0; 
         intersectY = 0; 
        } 
       } else if ((rect.origin.y + rect.height) > origin.y) { 
        if ((rect.origin.y + rect.height) > (origin.y + height)) { 
         intersectWidth = rect.width; 
         intersectHeight = height; 
         intersectX = rect.origin.x; 
         intersectY = origin.y; 
        } else { 
         intersectWidth = rect.width; 
         intersectHeight = rect.origin.y + rect.height - origin.y; 
         intersectX = rect.origin.x; 
         intersectY = origin.y; 
        } 
       } else { 
        intersectWidth = 0; 
        intersectHeight = 0; 
        intersectX = 0; 
        intersectY = 0; 
       } 
      } else if (origin.y < rect.origin.y) { 
       if ((origin.y + height) > rect.origin.y) { 
        if ((origin.y + height) > (rect.origin.y + rect.height)) { 
         intersectWidth = origin.x + width - rect.origin.x; 
         intersectHeight = rect.height; 
         intersectX = rect.origin.x; 
         intersectY = rect.origin.y; 
        } else { 
         intersectWidth = origin.x + width - rect.origin.x; 
         intersectHeight = origin.y + height - rect.origin.y; 
         intersectX = rect.origin.x; 
         intersectY = rect.origin.y; 
        } 
       } else { 
        intersectWidth = 0; 
        intersectHeight = 0; 
        intersectX = 0; 
        intersectY = 0; 
       } 
      } else if ((rect.origin.y + rect.height) > origin.y) { 
       if ((rect.origin.y + rect.height) < (origin.y + height)) { 
        intersectWidth = origin.x + width - rect.origin.x; 
        intersectHeight = rect.origin.y + rect.height - origin.y; 
        intersectX = rect.origin.x; 
        intersectY = origin.y; 
       } else { 
        intersectWidth = origin.x + width - rect.origin.x; 
        intersectHeight = height; 
        intersectX = rect.origin.x; 
        intersectY = origin.y; 
       } 
      } else { 
       intersectWidth = 0; 
       intersectHeight = 0; 
       intersectX = 0; 
       intersectY = 0; 
      } 
     } else { 
      intersectWidth = 0; 
      intersectHeight =0; 
      intersectX = 0; 
      intersectY = 0; 
     } 
    } else if (origin.x < (rect.origin.x + rect.width)) { 
     if ((origin.x + width) > (rect.origin.x + rect.width)) { 
      if (origin.y < rect.origin.y) { 
       if ((origin.y+height) > rect.origin.y) { 
        if ((origin.y + height) > (rect.origin.y + rect.height)) { 
         intersectWidth = rect.origin.x + rect.width - origin.x; 
         intersectHeight = rect.height; 
         intersectX = origin.x; 
         intersectY = rect.origin.y; 
        } else { 
         intersectWidth = rect.origin.x + rect.width - origin.x; 
         intersectHeight = origin.y + height - rect.origin.y; 
         intersectX = origin.x; 
         intersectY = rect.origin.y; 
        } 
       } else { 
        intersectWidth = 0; 
        intersectHeight = 0; 
        intersectX = 0; 
        intersectY = 0; 
       } 
      } else if (origin.y < (rect.origin.y + rect.height)) { 
       if ((origin.y + height) > (rect.origin.y + rect.height)) { 
        intersectWidth = rect.origin.x + rect.width - origin.x; 
        intersectHeight = rect.origin.y + rect.height - origin.y; 
        intersectX = origin.x; 
        intersectY = origin.y; 
       } else { 
        intersectWidth = rect.origin.x + rect.width - origin.x; 
        intersectHeight = height; 
        intersectX = origin.x; 
        intersectY = origin.y; 
       } 
      } else { 
       intersectWidth = 0; 
       intersectHeight = 0; 
       intersectX = 0; 
       intersectY = 0; 
      } 
     } else if (origin.y < rect.origin.y) { 
      if ((origin.y + height) > rect.origin.y) { 
       if ((origin.y + height) > (rect.origin.y + rect.height)) { 
        intersectWidth = width; 
        intersectHeight = rect.height; 
        intersectX = origin.x; 
        intersectY = rect.origin.y; 
       } else { 
        intersectWidth = width; 
        intersectHeight = origin.y + height - rect.origin.y; 
        intersectX = origin.x; 
        intersectY = rect.origin.y; 
       } 
      } else { 
       intersectWidth = 0; 
       intersectHeight = 0; 
       intersectX = 0; 
       intersectY = 0; 
      } 
     } else if (origin.y < (rect.origin.y + rect.height)) { 
      if ((origin.y + height) > (rect.origin.y + rect.height)) { 
       intersectWidth = width; 
       intersectHeight = rect.origin.y + rect.height - origin.y; 
       intersectX = origin.x; 
       intersectY = origin.y; 
      } else { 
       intersectWidth = width; 
       intersectHeight = height; 
       intersectX = origin.x; 
       intersectY = origin.y; 
      } 
     } else { 
      intersectWidth = 0; 
      intersectHeight = 0; 
      intersectX = 0; 
      intersectY = 0; 
     } 
    } else { 
     intersectWidth = 0; 
     intersectHeight = 0; 
     intersectX = 0; 
     intersectY = 0; 
    } 
    [intersectingRect setWidth:intersectWidth andHeight:intersectHeight]; 
    [intersectPt setX:intersectX andY:intersectY]; 
    [intersectingRect setOrigin:intersectPt]; 
    return intersectingRect; 
} 

的事情是,我不希望完全禁用斷點。我只是不明白爲什麼在這種情況下執行被暫停,因爲我沒有設置任何斷點。我不想禁用斷點,因爲最終我想使用它們。只是這個特殊情況出乎意料地暫停了。

+0

你試過簡單的重啓嗎?在很多情況下,XCode可能會對此產生困惑(我曾經有類似的事情發生過),並且重新啓動修復了它。這不是真正的答案(例如是什麼原因),但也可以解決它? – makdad 2010-12-07 00:40:18

+0

@phooze我只是試過了,它仍然不會停止執行。我可以運行其他課程,他們不會暫停。 – 2010-12-07 00:42:05

+0

這些步驟如何:http://stackoverflow.com/questions/1067689/how-to-disable-all-breakpoints-in-xcode – makdad 2010-12-07 00:43:54

回答

2

該程序出於某種原因試圖向已發佈的對象發送消息。修復dealloc方法的重載解決了暫停問題。在交叉方法內創建的對象然後由重載的dealloc方法釋放。因此,當主要嘗試發送消息釋放它時,它已經消失了。

0

編輯:當我回答時,您的問題中沒有代碼,所以這似乎不成問題。我會把它留在這裏,以防有人遇到同樣的暫停問題。


它實際上是暫停,我的意思是繼續按鈕可用和綠色?

如果不是,但執行似乎已停止 - 您的代碼dosnt似乎正在運行,但它並未真正暫停 - 那麼有可能應用程序正在運行循環中,等待輸入,但您不實際上已經準備好了,看起來好像掛了。

如果是這樣的話,它可能是類似於發生在我身上時,我叫的東西,有一個委託協議,但我忘了設定自我作爲委託這樣的程序流程再也沒有回到預期的委託方法。

值得一看,無論如何。