2010-08-27 2 views
0

Спасибо за помощь по этому вопросу.Выпуск NSString, вызывающий EXC_BAD_ACCESS

Я тяну NSDictionary от plist в моем основном комплекте и у меня проблемы. Вот код:

- (void)viewDidLoad { 

    // Pull in FAQ from Plist 
    NSString *strFAQPlist = [[NSBundle mainBundle] pathForResource:@"FAQs" ofType:@"plist"]; 
    dictFAQList = [[NSDictionary alloc] initWithContentsOfFile: strFAQPlist]; 

    // Create indexed array to hold the keys 
    arrFAQKeys = [[dictFAQList allKeys] retain]; 

    // Release local vars 
    [strFAQPlist release]; 

    [super viewDidLoad]; 
} 

Мне кажется, что я должен освободить NSString, как и я. Проблема в том, что когда я это делаю, я получаю ошибку EXC_BAD_ACCESS. Когда я прокомментирую эту публикацию, все работает нормально. Может кто-нибудь объяснить мне, почему это происходит?

Заранее благодарен!

+0

Попробуйте запустить статический анализатор, это очень хорошо подходит для обнаружения такого рода ошибок. – cobbal

ответ

3

pathForResource возвращает autoreleased NSString.

Только вызывать освобождение, если вы вызвали метод alloc/init, скопировали или сохранили его явно.

Если вы не создали объект напрямую (или сохранили его), не отпускайте его.

+0

Спасибо за помощь. В документации есть ли способ узнать, возвращается ли то, что возвращается, чтобы избежать повторения этого типа? Или это жесткое правило, что все, что я непосредственно не создавал, автореализован? –

+0

Это соглашение (и вы можете рассчитывать на то, что за ним следует API Cocoa). Все, за что вы отвечаете за выпуск, будет иметь «init» или «copy» перед именем. Например, NSArray arrayWithArray: будет автореализован, initWithArray: не будет. – MarkPowell