이 프로젝트는 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는 콜백 :
내가 가입으로 모두와 함께 투표 한에 노력하고 있습니다 할 유지할 필요가 없습니다 도와 주시고 가장 "아름다운"코드였던 해결책을 받아 들였습니다.
감사
두 번째 코드가 작동합니까? – Krishnabhadra
그것은 한 번 일했고, 끊임없이 추락 한 것보다, 내가 선언문에서 케이스를 옮기는 것보다 다시 충돌했다 –
계기에 ref 카운트 작전을 기록하고 오류가 발생할 때까지 기다린다. – justin