2011-09-26 15 views
281

Khi chuyển đổi dự án để sử dụng ARC, "trường hợp chuyển đổi nằm trong phạm vi được bảo vệ" nghĩa là gì? Tôi đang chuyển đổi một dự án sử dụng ARC, sử dụng Xcode 4 Edit -> Refactor -> Convert to Objective-C ARC ... Một trong những lỗi tôi nhận được là "trường hợp chuyển đổi là trong phạm vi bảo vệ" trên "một số" của chuyển mạch trong trường hợp chuyển đổi.Khi chuyển đổi dự án để sử dụng ARC, "trường hợp chuyển đổi nằm trong phạm vi được bảo vệ" nghĩa là gì?

Chỉnh sửa, Đây là mã:

các ERROR được đánh dấu vào "mặc định" trường hợp:

- (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; 
} 

Trả lời

653

Surround từng trường hợp riêng của mình với niềng răng {}. Điều đó sẽ khắc phục vấn đề (nó đã làm cho tôi trong một trong các dự án của tôi).

+20

Wow! Nó đã làm việc! nhưng tại sao?! – Ali

+12

Niềng răng giúp trình biên dịch hiểu phạm vi.Tôi biết GCC đã sử dụng để đưa ra cảnh báo nếu bạn khai báo một biến mới ở dòng đầu tiên của câu lệnh trường hợp không có dấu ngoặc ôm và video WWDC 2011 trên ARC đề cập đến một số thứ về các trường hợp kèm theo trong dấu ngoặc. Nếu bạn muốn biết lý do tại sao, hãy xem video đó — Tôi không thể nhớ ra đầu của tôi. – FeifanZ

+87

Đã lâu rồi, nhưng tôi dường như đã nhớ điều gì đó trong tiêu chuẩn C không cho phép gán biến sau câu lệnh trường hợp vì mã không thực sự nằm trong một khối. Bằng cách thêm dấu ngoặc nhọn '{...}' sau 'case' và trước' break', mọi thứ bên trong nằm trong một khối scoped và sẽ hoạt động như mong đợi. Tôi đã nhận được đến mức tôi chỉ tự động tạo một khối trong các câu lệnh 'case' của mình để tránh loại vấn đề này. – Paul

14

cứng để chắc chắn mà không nhìn vào mã này, nhưng nó có thể có nghĩa có một số khai báo biến xảy ra bên trong switch và trình biên dịch không thể biết nếu có một đường dẫn rõ ràng đến điểm dealloc được yêu cầu.

1
default: 
     CellIdentifier = @"Cell"; 
     cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
     if (cell == nil) { 
      ***initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];*** 
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
      } 
     break; 
    } 

Lưu ý: Kiểm tra! Cú pháp của dòng in nghiêng & in đậm. Chỉnh sửa nó và bạn tốt để đi.

5

Đối với tôi, vấn đề bắt đầu vào giữa một switch và dấu ngoặc nhọn không làm việc ra, trừ khi bạn phải bao gồm {} TRONG TẤT CẢ CÁC báo cáo trường hợp trước. Đối với tôi, lỗi xảy ra khi tôi có tuyên bố

NSDate *start = [NSDate date]; 

trong trường hợp trước đó. Sau khi tôi đã xóa này, thì tất cả các trường hợp tuyên bố tiếp theo đã sạch từ các thông báo lỗi phạm vi bảo vệ

+0

Điều tương tự; trường hợp lỗi ở giữa. Tôi chỉ phải di chuyển các khai báo biến trên switch (nó không phải là trường hợp phụ thuộc). Tôi không phải thêm niềng răng xung quanh các trường hợp (thời gian này). – eGanges

3

Trước:

case 2: 
     NSDate *from = [NSDate dateWithTimeIntervalSince1970:1388552400]; 
     [self refreshContents:from toDate:[NSDate date]]; 
     break; 

tôi chuyển NSDate định nghĩa trước khi chuyển đổi, và nó cố định các vấn đề biên dịch:

NSDate *from; /* <----------- */ 
switch (index) { 
    .... 
    case 2: 
     from = [NSDate dateWithTimeIntervalSince1970:1388552400]; 
     [self refreshContents:from toDate:[NSDate date]]; 
     break; 

} 
9

Có 2 cách dễ dàng để giải quyết vấn đề này:

  • Có thể bạn đang khai báo variab les. Di chuyển việc kê khai của các biến bên ngoài câu lệnh switch
  • Đặt khối trường hợp toàn bộ ở giữa cặp ngoặc nhọn {}

Trình biên dịch không thể tính toán dòng mã khi các biến sẽ được phát hành. Gây ra lỗi này.

2

Khai báo các biến bên ngoài chuyển đổi, sau đó nhanh chóng chúng trong trường hợp. đó đã làm việc một cách hoàn hảo đối với tôi sử dụng Xcode 6.2

0

Surround với niềng răng {} mã giữa trường hợp tuyên bố và nghỉ trong từng trường hợp. Nó hoạt động trên mã của tôi.

Các vấn đề liên quan