很抱歉这个标题非常模糊,我是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;
}
答案 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:方法的原因有很多。在封闭方法中放置断点,看看一切是否按预期工作。