Ответ 1
Окружать каждый случай с помощью фигурных скобок {}
. Это должно решить проблему (это было для меня в одном из моих проектов).
При преобразовании проекта в использование ARC, что означает "случай переключения в защищенной области"? Я конвертирую проект для использования ARC, используя Xcode 4 Edit → Refactor → Преобразовать в Objective-C ARC... Одна из ошибок, которые я получаю, это "случай переключения в защищенной области" на "некоторых" коммутаторах в корпусе коммутатора.
Изменить, Вот код:
ОШИБКА отмечена в случае "по умолчанию":
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"";
UITableViewCell *cell ;
switch (tableView.tag) {
case 1:
CellIdentifier = @"CellAuthor";
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.textLabel.text = [[prefQueries objectAtIndex:[indexPath row]] valueForKey:@"queryString"];
break;
case 2:
CellIdentifier = @"CellJournal";
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.textLabel.text = [[prefJournals objectAtIndex:[indexPath row]] valueForKey:@"name"];
NSData * icon = [[prefJournals objectAtIndex:[indexPath row]] valueForKey:@"icon"];
if (!icon) {
icon = UIImagePNGRepresentation([UIImage imageNamed:@"blank72"]);
}
cell.imageView.image = [UIImage imageWithData:icon];
break;
default:
CellIdentifier = @"Cell";
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
break;
}
return cell;
}
Окружать каждый случай с помощью фигурных скобок {}
. Это должно решить проблему (это было для меня в одном из моих проектов).
Трудно быть уверенным, не глядя на код, но это, вероятно, означает, что внутри коммутатора происходит некоторое объявление переменной, и компилятор не может определить, существует ли четкий путь к требуемой точке dealloc.
Есть два простых способа решить эту проблему:
Компилятор не может вычислить строку кода, когда переменные должны быть выпущены. Вызов этой ошибки.
Для меня проблема началась с середины коммутатора, а фигурные скобки не сработали, если только вы не должны включать {} ВСЕ ВСЕ предыдущие утверждения case. Для меня ошибка пришла, когда у меня было утверждение
NSDate *start = [NSDate date];
в предыдущем случае. После того, как я удалил это, вся последующая инструкция case вышла из сообщения об ошибке защищенной области
До:
case 2:
NSDate *from = [NSDate dateWithTimeIntervalSince1970:1388552400];
[self refreshContents:from toDate:[NSDate date]];
break;
Я переместил определение NSDate перед коммутатором и исправил проблему компиляции:
NSDate *from; /* <----------- */
switch (index) {
....
case 2:
from = [NSDate dateWithTimeIntervalSince1970:1388552400];
[self refreshContents:from toDate:[NSDate date]];
break;
}
Объявите переменные за пределами коммутатора, а затем создайте их в этом случае. Это отлично сработало для меня, используя Xcode 6.2
default:
CellIdentifier = @"Cell";
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
***initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];***
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
break;
}
Примечание: проверьте! Синтаксис жирной и курсивной строки. Исправьте его, и вы хорошо пойдете.
Окружать скобками {}
код между оператором case и разрывом в каждом случае.
Он работал над моим кодом.