返回对象崩溃的iPhone

时间:2010-10-09 15:49:09

标签: iphone objective-c

我对iPhone开发的整个世界相当新,所以如果这很容易就原谅我。我有一个对象Card,上面有6个Question个对象。当我说[card getQuestion:@"Art"]时,我正在返回Question这样的对象

- (Question*) getQuestion: (NSString*) questionType {
    Question *q = [questions objectForKey:questionType];
    return [q autorelease];
}

问题具有text属性(类型NSString),这使我可以看到问题的文本是什么。所以我想用这个文本来更新viewController中的UILabel

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"%@", [[self.card getQuestion:@"Art"] qText]);
    self.myQuestion.text = [[self.card getQuestion:@"Art"] qText];
}

这会导致iPhone崩溃,而如果我将对象Card中的功能更改为此

- (NSString*) getQuestion: (NSString*) questionType {
    return [[questions objectForKey:questionType] qText];
}

我在viewController中调用

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"%@", [self.card getQuestion:@"Art"]);
    self.myQuestion.text = [self.card getQuestion:@"Art"];
}

这很好..任何人都可以解释我做错了什么,在这两种情况下,对NSLog的调用都会返回相关文本。在这两种情况下,显示器都会加载,但在第一种情况下,它会在不久之后崩溃,而另一种情况则会保持稳定。

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:5)

- (Question*) getQuestion: (NSString*) questionType {
    Question *q = [questions objectForKey:questionType];
    return [q autorelease];
}

根据内存管理规则,您应该自动释放该对象,这几乎可以肯定是导致崩溃的原因。你放弃了你不拥有的对象的所有权,这导致它过早地解除分配。这意味着当另一个假定拥有该问题的对象试图访问它时,问题就会消失,并且您会因EXC_BAD_ACCESS错误而崩溃。

此外,该方法可能应称为questionForType:questionOfType:。使用get前缀意味着该对象将通过out参数返回,而不是。

答案 1 :(得分:0)

我可以看到两个错误,

1:你正在发布你不拥有的东西(问题'q') - 如果你要分配,复制或保留,你应该释放它。如果没有,你不应该。

2:setter-line应该写成:

Question *q = (Question *)[questions objectForKey:questionType];

这样可以避免收到警告或错误。

答案 2 :(得分:0)

由于你是新手 - 你绝对应该确保你运行你的应用程序寻找僵尸,并使用仪器应用程序运行它,以确保你不会泄漏任何地方。

你应该每隔几天在Objective-C中阅读一个关于记忆管理的非常简短的解释 - 有一天它会全部沉入并成为第二天性。

http://macdevelopertips.com/objective-c/objective-c-memory-management.html