Objective-C和在堆上创建新对象

Objective-C和在堆上创建新对象,objective-c,heap,Objective C,Heap,我是objective-C编程新手,尝试在方法中创建对象时遇到了一些问题。这个程序的目的是使一种表示有向图的方法,我稍后将用它来测试图论 这个问题 //From GraphObject.m -(void) addNode { GraphNode *newNode = [[GraphNode alloc] initWithId:count]; [graphNodes addObject:newNode]; NSLog(@"Node %i added", count);

我是objective-C编程新手,尝试在方法中创建对象时遇到了一些问题。这个程序的目的是使一种表示有向图的方法,我稍后将用它来测试图论

这个问题

//From GraphObject.m
-(void) addNode
{
    GraphNode *newNode = [[GraphNode alloc] initWithId:count];
    [graphNodes addObject:newNode];
    NSLog(@"Node %i added", count);
    count++;
}
这段摘录来自我的GraphObject类,是程序中断的地方。它在街区的第一行中断。 此方法用于创建GraphNode对象并将其放入GraphObject类的NSMutableArray(名为graphNodes)中。count变量只是跟踪添加了多少节点。 习惯于C++,我很难理解为什么它不能把对象放在堆上,让我使用它。顺便说一句,如果我把它放在我的main中,完全相同的行功能正确,这让我有点不舒服

如果有人能解释我做错了什么,我将不胜感激

编辑: 这里是initWithId方法。我开始怀疑原因可能在这里。它必须返回指向self的指针吗

-(id) initWithId:(int)n
{
    nodeId = [NSNumber numberWithInt:n];
    neighbourNodes = [NSMutableArray arrayWithCapacity:8];
    return self;
}
您提到的内存泄漏(yAak),我假设它是关于在这个方法中创建GraphNode数组的。但是,当我删除放置它们的数组时,这难道不能解决问题吗?如果我用相同的方法删除它们,就我所见,数组中不会放入任何内容。另外,我很抱歉没有发布任何错误消息,因为我是xcode新手,但我根本看不到任何错误消息。构建成功了,它只是简单地说程序在代码中的某一行停止了

EDIT2(和解决方案):好吧,这里有一个奇怪的惊喜。我删除/剪切了代码并运行了一次程序,然后将完全相同的代码粘贴回去,现在工作正常。这是一个稳定的IDE。再次感谢您的回复,我相信我很快就会回来。

您的初始值设定人:

-(id) initWithId:(int)n
{
    nodeId = [NSNumber numberWithInt:n];
    neighbourNodes = [NSMutableArray arrayWithCapacity:8];
    return self;
}
应该是这样的:

- (id)initWithId:(int)n
{
    self = [super init]; /* << or whatever the designated initializer of the superclass is */
    if (nil != self) {
        nodeId = [[NSNumber alloc] initWithInt:n];
        neighbourNodes = [[NSMutableArray alloc] initWithCapacity:8];
    }
    return self;
}
-(id)initWithId:(int)n
{

self=[super init];/*泄漏、NSZombies等都是有用的工具。但是,特别是当您不熟悉该语言时(有时甚至不熟悉),解决此类内存管理问题的最佳方法是:

1) 请阅读以下内容:

2) 再看看你的代码

3) 重读:

[…等]

在本例中,由于您没有获得NSNumber对象的所有权,因此它在应用程序运行循环的下一个周期之前被解除分配


这在main中没有发生,因为您在应用程序的runloop之外,并且没有自动释放池(您可能收到一条控制台消息,说对象泄漏是因为没有自动释放池)。如果您不确定这是什么,请阅读链接文档中有关自动释放池的部分。

发布您在错误出现时遇到的错误。我在这里看到的错误是潜在的内存泄漏,这不会导致中断。您可以发布-[GraphNode initWithId:]的实现吗?另外,请发布您看到的错误消息。您发布的代码没有任何错误。谢谢,我们也会解决此问题。