Как объявить строку NSString с несколькими возможными значениями - PullRequest
0 голосов
/ 26 января 2011

Я хочу объявить объект NSString для использования в предупреждении, но его фактическое содержание зависит от различных факторов, определяемых некоторой переменной.Мне интересно, как лучше подойти к этому.В большинстве случаев я делал что-то вроде этого:

- (void)info {
    NSString *targetString = [[NSString alloc] init];
    switch (self.target) {
        case 1:
            targetString = @"ONE";
            break;
        case 2:
            targetString = @"TWO";
            break;
        case 3:
            targetString = @"THREE";
            break;
        default:
            targetString = @"";
            break;
    }

NSString *message = [[NSString alloc] initWithFormat:@"Text: %@", targetString]; 
    UIAlertView *alert = [[UIAlertView alloc] 
                          initWithTitle:@"Info"
                          message:message 
                          delegate:self 
                          cancelButtonTitle:@"Ok!" 
                          otherButtonTitles:nil];
    alert.tag = kInfoAlert;
    [alert show];
    [alert release];
    [targetString release];
    [message release];
}

Однако, когда я запускаю это через анализатор сборки, я получаю сообщения о том, что строка пропускает память:

Прежде всегоон говорит:

Значение, сохраненное в 'targetString' во время его инициализации, никогда не читается

Тогда:

Потенциальная утечка выделенного объектав строке 137 и сохраняется в 'targetString'

Эти 2 комментария находятся в строках 136 и 137, где строка 136 равна

NSString *targetString = [[NSString alloc] init];

Альтернативный вариантобъявлять строку как

NSString *targetString;

и устанавливать ее в каждом случае как

targetString = [NSString stringWithFormat:@"ONE"]; 

и т.д.

или даже выделять строку в каждом случае для освобожденияэто в конце ...

Ну, что будет лучшим подходом здесь?

Спасибо,

Майкл:)

Ответы [ 3 ]

5 голосов
/ 26 января 2011

Причина утечки памяти в том, что вы без необходимости выделяете строку с этой строкой

NSString *targetString = [[NSString alloc] init];

, а затем устанавливаете ее в качестве литерального объекта.Определите targetString как nil, потому что когда вы устанавливаете для него другое значение, например targetString = @"ONE", вы больше не ссылаетесь на пустую строку, которую вы выделили, и это вызывает утечку памяти.Что касается вашего подхода к случаю переключения для определения значения, которое хорошо.

2 голосов
/ 26 января 2011

Полагаю, этого будет достаточно:

NSString *targetString = nil;

И тогда вам не нужно освобождать targetString.

0 голосов
/ 26 января 2011

Как насчет этого вместо переключателя:

- (NSString*) stringForIndex: (NSUInteger) index
{
    NSParameterAssert(index < 4);
    id strings[] = {@"none", @"one", @"two", @"three"};
    return strings[index];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...