Подумайте, что вы спрашиваете. Вы начинаете с:
-(void)someMethod
{ if (x == y)
{ NSString *string = [[NSString alloc] initWithString:@"Foo"];
NSLog(string); // outputs "Foo" to console successfully
}
...
NSLog(string); // Doesn't work, we're out of the scope of the "if" statement.
}
Что бы вы хотели сделать вторым NSLog
? Кажется, вы запрашиваете, чтобы он работал, если тело оператора if
было выполнено, или как? Выдает динамическую ошибку «необъявленная переменная»?
Теперь вы, кажется, хотите:
-(void)someMethod
{ if (x == y)
{ NSString *string = [[NSString alloc] initWithString:@"Foo"];
NSLog(string); // outputs "Foo" to console successfully
}
...
}
-(void)someOtherMethod
{
NSLog(string); // Doesn't work, we're out of the scope of the "if" statement.
}
Что вы хотите, чтобы произошло в someOtherMethod
, если тело оператора if
в someMethod
не было выполнено?
Как указывает решение @ Daniel, вы можете ссылаться на переменную, если она находится в scope . В случае одиночного метода вы перемещаете точку объявления из if
в тело включающего метода. В случае двух методов вы перемещаете его в класс - в качестве переменной экземпляра.
Теперь область действия - это не то же самое, что время жизни - переменная может существовать (быть активной), но не быть доступной (она находится вне области действия); общий пример - когда один метод вызывает другой, переменные вызывающего метода остаются живыми, но недоступны для вызываемого метода.
Аналогично тому, как переменная находится в scope , не означает, что она должна содержать действительное значение . Вот почему @Daniel помещает nil
в переменную - вы знаете, было ли создано значение внутри тела if
значением string
, не равным nil
.
Так что, возможно, это «динамическое» поведение, которое вы, похоже, ищете - вы должны объявить какой-то способ ссылки на значение (переменную), но вы указываете, было ли оно создано путем хранения некоторого стража (nil
в этом case) в переменной.