Ketika mengonversi proyek untuk menggunakan ARC, apa yang dimaksud dengan "sakelar kasus dalam cakupan terproteksi"? Saya mengonversi proyek untuk menggunakan ARC, menggunakan Xcode 4 Edit -> Refactor -> Konversi ke Objective-C ARC ... Salah satu kesalahan yang saya dapatkan adalah "sakelar kasus dalam cakupan yang dilindungi" pada "beberapa" sakelar di kasus saklar.
Edit, Ini kodenya:
ERROR ditandai pada case "default":
- (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;
}
{...}
setelahcase
dan sebelumbreak
, semua yang ada di dalamnya berada dalam blok yang tertutup dan akan berperilaku seperti yang diharapkan. Saya sampai pada titik bahwa saya secara otomatis membuat blok daricase
pernyataan saya untuk menghindari masalah semacam ini.Sulit untuk memastikan tanpa melihat kode, tetapi mungkin berarti ada beberapa deklarasi variabel yang terjadi di dalam saklar dan kompiler tidak dapat mengetahui apakah ada jalur yang jelas ke titik dealloc yang diperlukan.
sumber
Ada 2 cara mudah untuk mengatasi masalah ini:
Kompiler tidak dapat menghitung baris kode ketika variabel akan dirilis. Menyebabkan kesalahan ini.
sumber
Bagi saya, masalahnya dimulai di tengah sakelar dan kurung keriting tidak berhasil, kecuali Anda harus memasukkan {} DALAM SEMUA pernyataan kasus sebelumnya. Bagi saya kesalahan datang ketika saya memiliki pernyataan
dalam kasus sebelumnya. Setelah saya menghapus ini, maka semua pernyataan kasus berikutnya menjadi bersih dari pesan kesalahan cakupan yang dilindungi
sumber
Sebelum:
Saya memindahkan definisi NSDate sebelum beralih, dan memperbaiki masalah kompilasi:
sumber
Deklarasikan variabel di luar switch, lalu instantiate di dalam case. Itu bekerja dengan sempurna bagi saya menggunakan Xcode 6.2
sumber
Catatan: Periksa! Sintaks dari garis tebal & miring. Perbaiki itu dan Anda baik untuk pergi.
sumber
Dikelilingi dengan menguatkan
{}
kode antara pernyataan kasus dan istirahat di setiap kasus. Ini berhasil pada kode saya.sumber