Отладка Xcode и управление памятью NSArray - PullRequest
2 голосов
/ 13 февраля 2011

Я пишу приложение в соответствии с книгой по программированию какао Аарона Хиллегаса (глава 6).

Приложение показывает доступные голоса синтезатора речи.

Ниже приведены методы init и делегата для табличного представления:

- (id)init
{
    [super init];
    NSLog(@"init");
    speechSynth = [[NSSpeechSynthesizer alloc] init];
    [speechSynth setDelegate:self];
    availableVoices = [[NSSpeechSynthesizer availableVoices] retain];
    return self;
}


- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn*)aTableColumn row:(NSInteger)rowIndex
{
    NSString * aVoice = [availableVoices objectAtIndex:rowIndex];
    NSDictionary *voiceDict = [NSSpeechSynthesizer attributesForVoice:aVoice];
    return [voiceDict objectForKey:NSVoiceName];
}

У меня есть вопрос 1 об этой строке:

availableVoices = [[NSSpeechSynthesizer availableVoices] **retain**];

Зачем сохранять?Я попытался без сохранения, окно всплывает, но я перемещаю мышь на окне, программа перезапустилась:

(gdb) продолжение 2011-02-13 15: 57: 37.671 SpeakLine[4384: 80f] ** - [CFArray objectAtIndex:]: сообщение отправлено на освобожденный экземпляр 0x187e20 *

Вопрос 2:

Я отлаживаю эту программу, даже если я не сделалсохраняйте, можно использовать availableVoices, но отладчик Xcode показывает только девять содержимого, почему?Как можно посмотреть все содержимое массива?

Это снимок

Вопрос 3:

Почему программаразбился в середине срока не в начале?Когда было выпущено содержимое NSSpeechSynthesizer?

Ответы [ 2 ]

3 голосов
/ 13 февраля 2011

Обратите внимание, что ваш init шаблон неправильный.

Это должно быть:

- (void) init
{
   self = [super init];
   if (self) {
      ... init stuff here ...
   }
   return self;
}
availableVoices = [[NSSpeechSynthesizer availableVoices] retain];

Зачем сохранять?Я попытался без сохранения, окно всплывает, но я перемещаю мышь по окну, программа перегружена:

Это описано в Руководство по управлению памятью Objective-C ;короче говоря, если вы не создаете, не сохраняете, не выделяете и не копируете объект, вы должны сохранить его, если хотите, чтобы он оставался без изменений.

Я отлаживаю эту программу, даже если я этого не делалwrite retain, availableVoices также можно использовать, но отладчик Xcode показывает только девять содержимого, почему?Как можно посмотреть все содержимое массива?

Не понятно, о чем вы спрашиваете.Должно быть больше 9?Это должно измениться?Обратите внимание, что после освобождения объекта поведение при обмене сообщениями не определяется.Это будет работать иногда, пока память не будет перезаписана.

Наконец, неясно, что вы спрашиваете в # 3.Синтезатор речи, похоже, вообще не выпущен.

0 голосов
/ 13 февраля 2011

Вопрос 1

Когда вы получаете объект, который был автоматически выпущен для того, чтобы стать владельцем объекта, вы должны сохранить его.Когда вы закончите работу с объектом, вам нужно соответственно отпустить его.

Вопрос 2

Поскольку вы получили объект, который не стал владельцем результатов, могут быть непредсказуемыми.

Вопрос 3

Автоматически выпущенный объект в конечном итоге будет выпущен системой, поскольку вы не сохранили его, он исчезнет в один момент, как правило, при освобождении nsautoreleasepool.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...