返回对象崩溃的iPhone

Cat*_*sis 0 iphone objective-c

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

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

问题有一个属性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];
}
Run Code Online (Sandbox Code Playgroud)

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

- (NSString*) getQuestion: (NSString*) questionType {
    return [[questions objectForKey:questionType] qText];
}
Run Code Online (Sandbox Code Playgroud)

和我在viewController中的调用

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

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

任何帮助赞赏.

Dav*_*ong 5

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

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

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