Co oznacza „konwersja skrzynki w chronionym zakresie” przy konwersji projektu na ARC? Konwertuję projekt do użycia ARC, używając Xcode 4 Edycja -> Refaktoryzacja -> Konwertuj na ARC Objective-C ... Jednym z błędów, które dostaję, jest to, że „skrzynka przełączników jest chroniona” na „niektórych” przełącznikach w skrzynka przełączników.
Edytuj, oto kod:
BŁĄD jest zaznaczony na „domyślnym” przypadku:
- (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;
}
{...}
pocase
i przedbreak
, wszystko w środku jest w bloku z zakresem i będzie działało zgodnie z oczekiwaniami. Doszedłem do tego, że po prostu automatycznie blokuję mojecase
wypowiedzi, aby uniknąć tego rodzaju problemów.Trudno być pewnym, nie patrząc na kod, ale prawdopodobnie oznacza to, że wewnątrz przełącznika dzieje się deklaracja zmiennej, a kompilator nie jest w stanie stwierdzić, czy istnieje jasna ścieżka do wymaganego punktu dealloc.
źródło
Istnieją 2 proste sposoby rozwiązania tego problemu:
Kompilator nie może obliczyć wiersza kodu, kiedy zmienne mają zostać zwolnione. Powodowanie tego błędu.
źródło
Dla mnie problem zaczął się na środku przełącznika i nawiasy klamrowe nie zadziałały, chyba że musisz dołączyć {} WSZYSTKIMI poprzednim instrukcjom. Dla mnie błąd przyszedł, gdy miałem oświadczenie
w poprzednim przypadku. Po usunięciu tego, wszystkie kolejne instrukcje sprawy zostały usunięte z komunikatu o błędzie chronionego zakresu
źródło
Przed:
Przesunąłem definicję NSDate przed przełączeniem i naprawiłem problem z kompilacją:
źródło
Zadeklaruj zmienne poza przełącznikiem, a następnie ułóż je w skrzynce. To działało idealnie dla mnie przy użyciu Xcode 6.2
źródło
Uwaga: Sprawdź! Składnia linii pogrubionej i pochylonej. Wyprostuj i gotowe.
źródło
Otocz nawiasami klamrowymi
{}
kod między instrukcją case i przerwą w każdym przypadku. Działa z moim kodem.źródło