困惑为什么一段代码工作而另一段代码不在Objective C中

时间:2010-10-12 11:32:58

标签: iphone objective-c xcode ios

很抱歉这个标题非常模糊,我是Objective C的新手,并且对它有点挣扎。基本上我有以下代码部分:

Graph *graph1 = [[Graph alloc] init];
[graph1 addNode:@"TEST"];

这是在一定程度上工作。但我想改变它,因为上面的代码发生在按钮按下,因此我假设每次我这样做时都会创建一个新的“* graph1”。我以为我可以简单地改成它:

if(self = [super init]) 
{
    [self setGraph: [[Graph alloc] init]];
}
return self;

以上是在init方法中,以下是修改后的函数:

[graph addNode:@"TEST"];

然而,在调试时我发现addNode方法从未被调用过。

由于 扎克

这是testViewController.h

#import <UIKit/UIKit.h>
@class Graph;
@class Node;

@interface testViewController : UIViewController {

    Graph       *graph;
    UILabel     *label;

}


@property (nonatomic, retain) IBOutlet UILabel *label;
@property (nonatomic, retain) Graph *graph;

- (IBAction) buttonPressed:(id)sender;

@end

这是textViewController.m

#import "testViewController.h"
#import "Graph.h"
@implementation testViewController

@synthesize  label, graph;

- (id)init
{
    if(self = [super init]) 
    {
        [self setGraph: [[Graph alloc] init]];
    }
    return self;
}

- (IBAction)buttonPressed:(id)sender
{
    //Graph *graph1 = [[Graph alloc] init];
    [graph addNode:@"TEST"];


    Node *node1 = [[Node alloc] initWithLabel: @"LABEL"];
    label.text = node1.label;
}

4 个答案:

答案 0 :(得分:2)

首先想到的是图形为零,因此调用方法(发送消息)将不会产生任何结果。不需要的版本将导致EXC_BAD_ACCESS,而这似乎并非如此。

我想你是在UIViewController子类中调用所有这些,对吧?你确定调用了正确的init吗?如果您使用的是NIB,则应覆盖 - (id)initWithNibName:bundle:并将代码放在那里。我猜代码可能在普通的 - (id)init 中,因为你正在调用[super init]而不是[super initWithNibName:nameOrNil bundle:bundleOrNil],但是这样,如果初始化控制器使用NIB,您永远不会调用自定义代码,因此图形为零。

顺便说一下,如果graph属性是(保留),那么你也会在init中导致内存泄漏。

答案 1 :(得分:0)

我确定你现在已经解决了这个问题,但我同意“添加”是“未被调用”的原因是你的图形对象在那一刻是零

我会说,首先在“addNode”调用

周围添加一条测试消息
 NSLog(@"We tried to add here");
[graph addNode:@"TEST"];

这将告诉你正在调用添加 - 我打赌它是。

然后,如果您之前有过在添加调用之前初始化“graph”的调用,请尝试有条件地初始化它:

 if(graph == nil) graph = [[Graph alloc] init];
[graph addNode:@"TEST"];

注意,这只是为了找到问题。最后,我会说你在处理内存方面遇到了一些挑战。您可能没有参考问题,但后来有泄漏。根据此代码的执行频率,这可能是一个问题。

但至少通过上述测试,您可以更轻松地解决问题。

答案 2 :(得分:-1)

您是否在标题中声明了图形变量?即:Graph *graph;和相应的@property (nonatomic, retain) Graph *graph;

然后我会这样做:

   -(id) init {
        graph = [[Graph alloc] init];
        [graph retain];
    }

这可能会有所帮助(我认为这不会是因为a的唯一原因)如果你的变量没有被声明,那么你会得到像graph may not respond to addNode这样的警告,如果它没有被保留那么你的app当它运行时会崩溃)...除此之外,我看不出会出现什么问题。如果这不起作用,您能否发布.h和.m文件中的所有代码?

答案 3 :(得分:-1)

  

然后我会这样做:

-(id) init {
        graph = [[Graph alloc] init];
        [graph retain];
    }
     

可能会有所帮助

这会导致内存泄漏。 图形 指向的对象的保留计数的保留计数为2.不理想。如果您使用 保留 属性声明属性,则

[self setGraph:[[[Graph alloc] init] autorelease]];

应该这样做。我去 -

self.graph = [[[Graph alloc] init] autorelease];

没有调用addNode:方法的原因有很多。在封闭方法中放置断点,看看一切是否按预期工作。