Ожидайте бросает монитор, таким образом, у Вас должен быть он для отказа от него. Уведомьте должен иметь монитор также.
главная причина, почему Вы хотите сделать, это должно гарантировать, чтобы у Вас был монитор, когда Вы возвращаетесь из ожидания () - обычно, Вы используете ожидать/уведомлять протокол для защиты некоторого совместно используемого ресурса, и Вы хотите, чтобы он был безопасен коснуться его, когда ожидают возвраты. То же с уведомляет - обычно, что Вы изменяете что-то и затем звоните, уведомляют () - что Вы хотите иметь монитор, внести изменения, и вызов уведомляет ().
, Если Вы сделали функцию как это:
public void synchWait() {
syncronized { wait(); }
}
у Вас не было бы монитора, когда ожидают, возвратился - Вы могли получить его, но Вы не могли бы получить его затем.
Фактически можно объявлять переменные внутри переключателя, если вы делаете это в соответствии с синтаксисом языка. Вы получаете сообщение об ошибке, потому что « case 0:
» - это метка, а в C недопустимо иметь объявление в качестве первого оператора после метки - обратите внимание, что компилятор ожидает выражение , такое как вызов метода, нормальное присваивание и т.д. (хотя это может быть странно, но это правило).
Когда вы помещаете NSLog () в первую очередь, вы избегаете этого ограничения. Вы можете заключить содержимое регистра в фигурные скобки {}, чтобы ввести блок области видимости, или вы можете переместить объявление переменной за пределы переключателя. Что вы выберете, зависит от личных предпочтений. Просто имейте в виду, что переменная, объявленная в фигурных скобках {}, действительна только в этой области, поэтому любой другой код, который его использует, также должен быть заключен в эти фигурные скобки.
Изменить:
Между прочим, эта причуда не такая уж редкость, как вы могли подумать. В C и Java также незаконно использовать объявление локальной переменной в качестве единственного оператора (что означает «не заключенное в фигурные скобки) в для , while или do , или даже в предложениях if и else (на самом деле, это описано в головоломке № 55 из "Java Puzzlers" , которую я очень рекомендую.) Я думаю, что мы обычно не пишем такие ошибки для начала, потому что не имеет смысла объявлять переменную как единственный оператор в таких контекстах. С switch / case конструкции , хотя, некоторые люди опускают фигурные скобки, поскольку оператор break является критическим оператором для потока управления.
Чтобы убедиться, что бросок компилятора подходит, скопируйте этот ужасный, бессмысленный фрагмент в свой (Objective-) C-код:
if (1)
int i;
else
int i;
for (int answer = 1; answer <= 42; answer ++)
int i;
while (1)
int i;
do
int i;
while (1);
] Еще одна причина всегда использовать фигурные скобки {} для ограничения тела таких конструкций. : -)
Я уже сталкивался с этой проблемой раньше и пришел к выводу, что вы просто помещаете код в блок.
switch (i) {
case 0:
{
int j = 1;
break;
}
}