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

Заранее спасибо!


person Jesse Bunch    schedule 27.08.2010    source источник
comment
Попробуйте запустить статический анализатор, он очень хорошо находит такие ошибки.   -  person cobbal    schedule 28.08.2010


Ответы (1)


pathForResource возвращает автоматически выпущенный NSString.

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

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

person MarkPowell    schedule 27.08.2010
comment
Спасибо за вашу помощь. Есть ли в документации способ узнать, автоматически ли возвращается то, что возвращается, чтобы снова избежать подобных проблем? Или это жесткое быстрое правило, что все, что я не создал напрямую, выпускается автоматически? - person Jesse Bunch; 28.08.2010
comment
Это соглашение (и вы можете рассчитывать на то, что Cocoa API будет следовать ему). Все, что вы несете ответственность за выпуск, будет иметь инициализацию или копию перед именем. Например, NSArray arrayWithArray: будет выпущен автоматически, а initWithArray: — нет. - person MarkPowell; 28.08.2010