Objective-C "если" заявления не сохраняя - PullRequest
3 голосов
/ 25 апреля 2010

Я знаю, что название этого вопроса немного сбивает с толку, но оно все равно идет:

Я создаю строку NSString после оператора if, но, похоже, она не хочет оставаться вне оператора. Моя условно выглядит так:

if ([[password stringValue] isEqualToString:@""]) {
    NSString *pwd = [[NSString alloc]initWithString:@"password"];
}
else {
    NSString *pwd = [[NSString alloc]initWithFormat:@"%@", [password stringValue]];
}

... и я вызываю pwd позже в сценарии так:

NSArray *arguments;
arguments = [NSArray arrayWithObjects: ip, pwd, nil];
[task setArguments: arguments];

Но когда я делаю это таким образом, первый фрагмент возвращает предупреждение Unused variable 'pwd', а последний вызов заканчивается ошибкой 'pwd' undeclared.

Что я здесь не так делаю? Заранее спасибо. ;)

Ответы [ 3 ]

19 голосов
/ 25 апреля 2010

Использование:

NSString* pwd = nil;
if ([[password stringValue] isEqualToString:@""]) {
    pwd = [[NSString alloc]initWithString:@"password"];
} else {
    pwd = [[NSString alloc]initWithFormat:@"%@", [password stringValue]];
}

Проблема в том, что каждый блок представляет область действия. Переменная существует только в той области, в которой она определена (переменная существует от точки объявления до конца области, в которой она объявлена). Хотя память, на которую указывает «pwd», превзойдет блок if ... else, указатель с именем pwd перестанет существовать после блока if ... else, в котором он объявлен. Объявление указателя до того, как блок переместится на одну область видимости.

10 голосов
/ 25 апреля 2010

Это не проблема сохранения, а одна из областей ваших объявлений: объявление в фигурных скобках имеет лексическую область, которая заканчивается закрывающей фигурной скобкой - это объявление просто не видно вне блока! Так что просто переместите вашу декларацию перед блоком и выполняйте только инициализацию внутри блока, т.е.

NSString *pwd;
if ([[password stringValue] isEqualToString:@""]) {
    pwd = [[NSString alloc]initWithString:@"password"];
}
else {
    pwd = [[NSString alloc]initWithFormat:@"%@", [password stringValue]];
}
0 голосов
/ 25 апреля 2010

Вы объявили pwd как локальную переменную внутри тела if. Переменная, на которую вы ссылаетесь позже, вероятно, объявлена ​​снаружи и никогда не устанавливается ни одним из назначений. Просто удалите NSString * из заданий.

...