什么会导致我的程序在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;
}
问题是我不想完全禁用断点。我只是不明白为什么在这种情况下暂停执行,因为我没有设置任何断点。我不想禁用断点,因为最终我想使用断点。正是这种特殊情况出乎意料地暂停了。
答案 0 :(得分:2)
该程序出于某种原因试图向已经发布的对象发送消息。修复dealloc方法的重载解决了暂停问题。然后,通过重载的dealloc方法释放在交叉方法中创建的对象。因此,当主要尝试发送消息以释放它时,它已经消失了。
答案 1 :(得分:0)
编辑:我回答时,您的问题中没有代码,所以这似乎不是问题所在。我会把它留在这里,万一有人有同样的暂停问题。
它是否实际暂停,我的意思是“继续”按钮是否可用且是绿色?
如果没有,但执行似乎已经停止 - 你的代码dosnt似乎正在运行但它并没有真正暂停 - 那么应用程序可能正处于运行循环中,等待输入,但你实际上并没有准备好了,似乎它已经挂了。
如果是这种情况,它可能类似于我在调用具有委托协议的内容时发生的事情,但我忽略了将 self 设置为委托,因此程序流程从未返回到预期的代表方法。
无论如何,值得一看。