Was bedeutet bei der Konvertierung eines Projekts zur Verwendung von ARC "Switch Case ist im geschützten Bereich"? Ich konvertiere ein Projekt zur Verwendung von ARC mit Xcode 4 Bearbeiten -> Refactor -> In Objective-C ARC konvertieren ... Einer der Fehler, den ich erhalte, ist "Schaltergehäuse befindet sich im geschützten Bereich" für "einige" der Schalter in ein Schaltergehäuse.
Bearbeiten, hier ist der Code:
Der FEHLER ist im "Standard" -Fall markiert:
- (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;
}
{...}
nachcase
und vor dembreak
befindet sich alles in einem Block mit Gültigkeitsbereich und verhält sich wie erwartet. Ich bin zu dem Punkt gekommen, dass ich meinecase
Aussagen einfach automatisch blockiere, um diese Art von Problem zu vermeiden.Es ist schwer sicher zu sein, ohne den Code zu betrachten, aber es bedeutet wahrscheinlich, dass im Switch eine Variablendeklaration stattfindet und der Compiler nicht erkennen kann, ob es einen klaren Pfad zum erforderlichen Dealloc-Punkt gibt.
quelle
Es gibt zwei einfache Möglichkeiten, um dieses Problem zu lösen:
Der Compiler kann die Codezeile nicht berechnen, wenn die Variablen freigegeben werden sollen. Diesen Fehler verursachen.
quelle
Für mich begann das Problem in der Mitte eines Schalters und geschweifte Klammern funktionierten nicht, es sei denn, Sie müssen {} IN ALLE vorherigen case-Anweisungen einfügen. Für mich kam der Fehler, als ich die Aussage hatte
im vorherigen Fall. Nachdem ich dies gelöscht hatte, wurden alle nachfolgenden case-Anweisungen von der Fehlermeldung für den geschützten Bereich befreit
quelle
Vor:
Ich habe die NSDate-Definition vor dem Wechsel verschoben und das Kompilierungsproblem behoben:
quelle
Deklarieren Sie die Variablen außerhalb des Schalters und instanziieren Sie sie dann innerhalb des Gehäuses. Das hat bei mir mit Xcode 6.2 perfekt funktioniert
quelle
Hinweis: Überprüfen! Die Syntax der fett und kursiv geschriebenen Zeile. Korrigieren Sie es und Sie können loslegen.
quelle
Umschließen Sie
{}
den Code zwischen der case- Anweisung und der Unterbrechung jeweils mit geschweiften Klammern . Es hat bei meinem Code funktioniert.quelle