即使没有设置断点,GDB也会在XCode中暂停程序

时间:2010-12-07 00:35:55

标签: objective-c xcode

什么会导致我的程序在Xcode上暂停?我没有设置断点,当我执行我的代码时,gdb提示出现在命令行上。有没有人对此有快速建议。 程序本身不会崩溃并返回正确的值。它只是不会停止执行。

告诉你一些我在做什么。我正在阅读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;
}

问题是我不想完全禁用断点。我只是不明白为什么在这种情况下暂停执行,因为我没有设置任何断点。我不想禁用断点,因为最终我想使用断点。正是这种特殊情况出乎意料地暂停了。

2 个答案:

答案 0 :(得分:2)

该程序出于某种原因试图向已经发布的对象发送消息。修复dealloc方法的重载解决了暂停问题。然后,通过重载的dealloc方法释放在交叉方法中创建的对象。因此,当主要尝试发送消息以释放它时,它已经消失了。

答案 1 :(得分:0)

编辑:我回答时,您的问题中没有代码,所以这似乎不是问题所在。我会把它留在这里,万一有人有同样的暂停问题。


它是否实际暂停,我的意思是“继续”按钮是否可用且是绿色?

如果没有,但执行似乎已经停止 - 你的代码dosnt似乎正在运行但它并没有真正暂停 - 那么应用程序可能正处于运行循环中,等待输入,但你实际上并没有准备好了,似乎它已经挂了。

如果是这种情况,它可能类似于我在调用具有委托协议的内容时发生的事情,但我忽略了将 self 设置为委托,因此程序流程从未返回到预期的代表方法。

无论如何,值得一看。