Я хочу объявить объект NSString для использования в предупреждении, но его фактический контент зависит от различных факторов, определенных некоторой переменной. Мне интересно, как лучше подойти к этому. В большинстве случаев я сделал что-то вроде этого:Как объявить 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"];
и т.д.
Или даже allocing строки в каждом конкретном случае для того, чтобы выпустить его в конце ...
Ну, что бы лучший подход здесь?
Спасибо,
Michael :)
Так что я должен просто объявить его как NSString * targetString, а затем установить его как targetString = @ "ONE"? – Smikey
Не объявляйте его ничтожным.'NSString * targetString = nil;', а затем установите его в литерал в инструкции switch. Также нет необходимости выделять targetString при установке его в строку. – Joe
Что касается строки, которую я устанавливаю, это не простой литерал, т. Е. Мне нужно объявить что-то вроде [[NSString alloc] initWithFormat: @ «Some text plus% @», someString]; Затем я выделяю память. Должен ли я использовать метод удобства? – Smikey