2012-04-27 3 views
0

이 프로젝트는 iOS 5.0 용입니다. 자동 참조 계산을 설정했습니다. 어떻게 든 retain 문을 작성하면 코드를 컴파일 할 수 없습니다.objective c 스위치 유지 오류

저는 if와 else if를 많이 생성하고 싶지 않기 때문에 함수에 스위치를 썼습니다.

내 코드 부분은 간단한 상대적이며 정확한 것 같다,하지만 것 같다 :이 메시지를 받았습니다 런타임에

NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; 

switch (selectedRow) { 

    case 0://English 
     [userDefaults setObject:@"English" forKey:@"language"]; 
     break; 
    case 1:// Deutsch 
     [userDefaults setObject:@"German" forKey:@"language"]; 
     break; 
    case 2://Français 
     [userDefaults setObject:@"French" forKey:@"language"];   
     break; 
    case 3://Italiano 
     [userDefaults setObject:@"Italian" forKey:@"language"];  
     break; 
    case 4://Español 
     [userDefaults setObject:@"Spanish" forKey:@"language"]; 
     break; 

    default: 
     break; 
} 
// flush: 
[userDefaults synchronize]; 

가 : 는 *** - [MyClass에 유지] : 메시지가 할당이 해제 된 인스턴스로 전송 0x6e78580 이며, 경우에 따라 분기의 [userDefaults setObject 행]에서 XCode가 중단 선으로 표시됩니다.

스위치를 컴파일 할 때마다 컴파일을 보았을 때 클래스가 생성됩니다. 그러나 Java, C# 또는 Obj-C 언어가 확실하지 않습니다. 클래스를 떠났으 며 switch 클래스를 실행하면 userDefaults 변수가 dealloc되므로 이것이 userDefaults 객체의 할당을 해제하는 이유입니다. 이제는이 스위치를 쓰는 방법을 잘 모르거나 전문적으로 보입니다. 각 경우에 userDefaults 변수를 작성하여 거기에 플러시하고 싶지 않습니다. 유일한 해결책은이 스위치를 if-else에 쓰는 것입니다.

노력하고 있습니다 :

NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; 

    switch (selectedRow) { 

     case 0://English 
     { 
      [userDefaults setObject:@"English" forKey:@"language"]; 
     } 
      break; 
     case 1:// Deutsch 
     { 
      [userDefaults setObject:@"German" forKey:@"language"]; 
     } 
      break; 
     case 2://Français 
     { 
      [userDefaults setObject:@"French" forKey:@"language"];   
     } 
      break; 
     case 3://Italiano 
     { 
      [userDefaults setObject:@"Italian" forKey:@"language"];  
     } 
      break; 
     case 4://Español 
     { 
      [userDefaults setObject:@"Spanish" forKey:@"language"]; 
     } 
      break; 

     default: 
      break; 
    } 
    // flush: 
    [userDefaults synchronize]; 

이유는 무엇입니까?

  • 왜 작동했는지는 확실하지 않지만 다시 충돌합니다.

    스위치 (selectedRow) {

    case 0://English 
        { 
         NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; 
         [userDefaults setObject:@"English" forKey:@"language"]; 
         // flush: 
         [userDefaults synchronize]; 
        } 
         break; 
        case 1:// Deutsch 
        { 
         NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; 
         [userDefaults setObject:@"German" forKey:@"language"]; 
         // flush: 
         [userDefaults synchronize]; 
        } 
         break; 
        case 2://Français 
        { 
         NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; 
         [userDefaults setObject:@"French" forKey:@"language"]; 
         // flush: 
         [userDefaults synchronize];   
        } 
         break; 
        case 3://Italiano 
        { 
         NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; 
         [userDefaults setObject:@"Italian" forKey:@"language"]; 
         // flush: 
         [userDefaults synchronize];  
        } 
         break; 
        case 4://Español 
        { 
         NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; 
         [userDefaults setObject:@"Spanish" forKey:@"language"]; 
         // flush: 
         [userDefaults synchronize]; 
        } 
         break; 
    
        default: 
         break; 
    } 
    

이 다시 추락하고 나는 대답 :

내가 제안보고를 확인하기 위해 여기에 온 : 나는 코드 내부의 변수를 이동 한 벨로우즈 :

NSArray * languages = [NSArray arrayWithObjects: @"English", @"German", @"French",@"Italian", @"Spanish", nil]; 
    NSString * selectedLanguage = [languages objectAtIndex: selectedRow]; 
    [[NSUserDefaults standardUserDefaults] setObject: selectedLanguage forKey:@"language"]; 

같은 줄에서이 충돌 :

[[NSUserDefaults standardUserDefaults] setObject: selectedLanguage forKey:@"language"]; 
  • 무엇이 잘못 되었나요? 그것을 믿을 수 없다. *** - [MyClass retain] : 할당 취소 된 인스턴스로 전송 된 메시지 0x6b532c0

MyClass는 UIViewContoller입니다. 나는 언어 선택을하고 몇 가지 버튼을 눌러 한 두 화면을 탐색하고 다시 돌아와 언어 선택을 다시하면 추락하지만 항상 그런 것은 아닙니다. 하지만 언제 항상 같은 줄에서 항상 동일한 오류 메시지가 충돌합니다.

네비게이션과

userDefaults setObject 

을 가지고 무엇?

---------------------------------------------- -------------------------- 솔루션을

을 쉽게 찾을 수보다 : -----

는 진짜 문제있어 -------------------------

나는 다음과 같이 썼다 : userDefaults setObject 또한 쓴 : 이것은 ARC 프로젝트이며 MyClass에서 실패한다. 보유, 내 코드가 될 수 없습니다.

코드는 작업 시트가있는 언어 선택입니다. 내가 검색을 할 경우 나는 다음 링크를해야합니다 : 거기에서 EXC_BAD_ACCESS invoking a block

  • 내가 사본 어딘가에 대신 유지의 생성이 있어야 참조. 질문은 setObject에 retain이 필요한 이유입니다. 글쎄, 그것은 변경 리스너를 추가했기 때문에 ...

// [[NSUserDefaults standardUserDefaults] addObserver : 자기 forKeyPath : @ "언어"옵션 : NSKeyValueObservingOptionNew 컨텍스트 : NULL];

코드 제거 및 콜백의 내용이이 문제를 해결 스위치 코드 후 이동 - A는 콜백 :

내가 가입으로 모두와 함께 투표 한에 노력하고 있습니다 할 유지할 필요가 없습니다 도와 주시고 가장 "아름다운"코드였던 해결책을 받아 들였습니다.

감사

+0

두 번째 코드가 작동합니까? – Krishnabhadra

+0

그것은 한 번 일했고, 끊임없이 추락 한 것보다, 내가 선언문에서 케이스를 옮기는 것보다 다시 충돌했다 –

+0

계기에 ref 카운트 작전을 기록하고 오류가 발생할 때까지 기다린다. – justin

답변

1

가 아닌 경우 귀하의 질문에 대답하지만, 어떻게 switch를 죽겠다 및 사용에 대한 :

NSArray * languages = [NSArray arrayWithObjects: @"English", @"German", @"French", 
               @"Italian", @"Spanish", nil]; 
NSString * selectedLanguage = [languages objectAtIndex: selectedRow]; 
[[NSUserDefaults standardUserDefaults] setObject: selectedLanguage forKey:@"language"]; 
1

부분 대답 : 당신이 경우에 바르를 선언 할 경우 두 번째 예제에서했던 것처럼

목표 - C 스위치의 경우 문에서

는, 당신은, 중괄호 사건을 묶어야합니다 (내가 본 예제에서는 중괄호 안에 break 문을 넣었지만).

사례 문은 변수를 선언하지 않지만 NSUserDefaults가 효과적으로 개체를 만들어 중괄호를 필수로 설정합니다. (편집 : 아래에 그의 대답에 메모를 starbugs 당신이 쓸 때, 당신 있습니다는 객체를 인스턴스화 @ "언어".) 두 번째 예는 작동하는 경우

그래서, 왜 함께하지? 비전문가는 어떻게 보입니까? 특히 case-switches를위한 여분의 브레이스가 Objective-C의 표준입니다.

+0

케이스 스위치를위한 여분의 브레이스가 표준이라고 생각하지 않는다. Objective-C를 위해서 ... 그 정보는 어디에서 왔는가? – starbugs

+0

Mark와 LaMarche가 Apress의'Beginning iPhone 3 Development'에 처음 소개되었습니다. 그것은 항상 사실로 입증되었습니다. 중괄호없이 switch-case 문 안에 객체를 선언하면 컴파일되지 않습니다. – Wienke

+0

이것은 스칼라 변수와 객체를 선언 할 때도 마찬가지입니다. – Wienke

2

이 문제는 오브젝티브 C로하지만, 일반적으로 C/C++ 특정하지 않습니다. this answer을보고 싶을 수 있습니다.

첫 번째 코드의 문제점은 Objective-C 컴파일러가 NSString의 인스턴스화와 관련된 마법을 수행한다는 것입니다. 위의 질문에 설명 된 문제가 발생할 가능성이 큽니다. 간단히 말해서 로컬 변수를 인스턴스화하는 모든 case 문을 중괄호로 묶어야하고 @"something"이 정확하게 수행해야합니다.