2010-10-09 3 views
0

Im довольно новый для всего мира iPhone dev, так что простите меня, если это очень просто. У меня есть объект Card, который содержит 6 Question объектов на нем. когда я говорю [card getQuestion:@"Art"] я в настоящее время возвращает Question объект как такОбратный объект сбой iPhone

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

Вопрос имеет свойство text (типа NSString), который позволяет мне увидеть, что текст на вопрос. Поэтому я хочу, чтобы использовать этот текст для обновления UILabel в ViewController

- (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 возвращает мне соответствующий текст. В обоих случаях дисплей загружается, но в первом случае он сбрасывается вскоре после этого, тогда как в остальном он остается стабильным.

Любая помощь приветствуется.

+0

Если кто-то отвечает на ваш вопрос, вы должны принять его. – bbum

+1

** Исправление: ** Если кто-то ответит на ваш вопрос ** с помощью решения, которое вам помогло **, вы должны принять его, щелкнув ✔ рядом с ответом, который присудит автору. – Emil

+0

@Emil правильный ответ не всегда полезный ответ. –

ответ

0

Поскольку вы новичок во всем этом, вы должны обязательно убедиться, что вы запустите приложение, ищите зомби, а также запускайте его с помощью приложения инструментов, чтобы убедиться, что вы никуда не просачиваетесь.

Вы должны прочитать очень короткое объяснение памяти в Objective-C каждые несколько дней - в один прекрасный день все это погрузится и станет второй натурой.

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

+0

Да, я прочитал и понял основы управления памятью Obj C, просто случай внедрения его на практике, это единственный способ, которым я буду учиться, делая это неправильно. Спасибо за ссылку, я добавил ее в закладки и прочитаю ее несколько раз :) – Catharsis

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

Согласно правилам управления памятью, вы должны не быть autoreleasing этого объекта, и это почти наверняка, что вызывает у вас сбой. Вы отказываетесь от владения каким-либо объектом, которого вы не обладаете, что приводит к преждевременному его освобождению. Это означает, что когда другой объект, который предположил, что, чтобы задать вопрос, пытается получить к нему доступ, вопрос ушел, и вы столкнулись с ошибкой EXC_BAD_ACCESS.

Кроме того, этот метод, вероятно, следует называть questionForType: или questionOfType:. Использование префикса get подразумевает, что объект будет возвращен через внешний параметр, а это не так.

+0

Это взломало его, большое спасибо, я взял этот материал autorelease из другого примера, который я нашел где-то, но я думаю, что это не приложение для iPhone. Ох и спасибо за подсказку функции, пытаясь использовать соглашения об именах – Catharsis

0

Я вижу две ошибки,

1: Вы отпускаете то, что вы не владеете (вопрос «Q») - Если вы либо Alloc, скопировать или сохранить, вы должны освободить его. Если нет, вы не должны.

2: сеттер-линия должна быть записана следующим образом:

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

Таким образом, вы избежать предупреждений или ошибок.

+0

1 правильно, 2 не нужно. 'objectForKey:' возвращает объект типа 'id', который можно безопасно назначить в любую переменную объекта без кастинга. –

+0

У меня иногда возникали проблемы, когда вы не бросали объект (например, делегат). – Emil

Смежные вопросы