EXC 해결BAD_ACCESS 오류 메서드 - NSZombieEnabled
3756 단어 아이폰 개발 프레임워크 부분
예를 들어 방출된 대상에게 메시지를 보낼 때 나타납니다, EXCBAD_ACCESS, 그리고release의 대상,release,release의 autorelease의 대상 등도 이런 잘못을 보고할 수 있다.기본 설정에서 Xcode는 방출된 대상을 사용하지 말아야 하거나,release가 잘못 사용했는지 확인하지 않습니다.
예를 들어, UIViewController 하위 클래스의 코드는 다음과 같습니다.
static NSMutableArray*array;
-(void)viewDidLoad
{
[superviewDidLoad];
array= [[NSMutableArray alloc]initWithCapacity:5];
[array release];//
}
- (void)viewWillAppear:(BOOL)animated{
[array addObject:@"Hello"];//
}
위에 코드가 EXCBAD_ACCESS 오류입니다. 하지만 제가 실행할 때 Xcode가 잘못되면 App Delegate의 응용 프로그램에 위치합니다:didFinish Launching With Options: 방법의 한 줄에 위치합니다. 코드량이 많으면 구체적인 문제를 찾기가 매우 어렵지만 경험에 의존합니다.
그러나 NSZombieEnabled 환경 변수는 우리를 도울 수 있다. 바로 NSZombieEnabled 환경 변수를 설정하면 대상이 소각될 때 로 전환된다.NSZombie, NSZombie Enabled를 설정한 후 방출된 대상에게 메시지를 보내면 그 대상은 이전처럼 Crash나 이해하기 어려운 행동을 하지 않고 오류 메시지를 보내고 예측 가능한 debug 단점을 생성할 수 있는 방식으로 사라지기 때문에 구체적이거나 대개 어떤 대상이 잘못 방출되었는지 찾을 수 있습니다.
Xcode에 NSZombieEnabled를 설정하면 Xcode는 행 [array addObject: @ "Hello"]를 명시적으로 지정하고 콘솔에서 보고하는 오류 메시지는 다음과 같습니다.
*** -[__NSArray addObject:]:message sent to deallocated instance 0x6557370
NSZombie Enabled를 설정하는 방법은 Xcode 3과 Xcode 4의 설정이 다르기 때문에 Xcode 4의 설정은 매우 간단합니다.Xcode 3에서 NSZombieEnabled를 다음과 같이 설정합니다.
1. XCode 왼쪽에 있는 Groups & Files 표시줄에서 Executables를 찾아 그 중 하나를 두 번 클릭하거나 Get Info를 오른쪽 단추로 눌러라.2. Arguments 3.여기에는 모두 두 개의 상자가 있는데, 아래의Variables to be set in theenvironment: 점 + 번호에 하나를 추가하고, Name에는 NSZombie Enabled를 입력하고,Value는 Yes를 입력하며, 앞의 갈고리가 선택되었음을 보증합니다.
Xcode 4에서 NSZombieEnabled를 설정하는 방법:
Xcode 4 메뉴 Product -> Edit Scheme-> Arguments를 클릭하고 "더하기"를 누르면 NSZombie Enabled 파라미터를 Environment Variables 창에 추가하고, 뒤의 수치는 "YES"라고 쓸 수 있습니다.
또는 Xcode 4 메뉴 Product -> EditScheme -> Diagnostics 설정 창에 Enable Zombie Objects를 직접 표시하면 됩니다. Xcode는 cmd+shift++
Xcode4는 현재의 요구를 고려했기 때문에 더욱 간편한 설정 방식을 제공합니다. 이 창에 다른 파라미터를 설정할 수도 있습니다. 이로써 더 많은 도움말을 얻을 수 있습니다.
그리고 만약에 Xcode에 NSZombie Enable를 설정하지 않았다면 아래 코드와 같이 정확하게 실행할 수 있습니다. 원하는 결과를 출력할 수 있습니다. "Hello"
static NSMutableArray*array;
-(void)viewDidLoad
{
[super viewDidLoad];
array= [[NSMutableArray alloc]initWithCapacity:5];
[array release];
[array addObject:@"Hello"];// crash, , , array 。
NSLog(@"%@",[array objectAtIndex:0]);
}
그러나 NSZombie Enable 설정을 추가하면 위의 코드 행 [array addObject: @ "Hello"]도 투기를 할 수 없으며 오류 알림을 받을 수 있습니다.
*** -[__NSArrayM addObject:]:message sent to deallocated instance 0x6557370
이 array가 가리키는 메모리가 원래의 데이터라고 해도 NSZombie Enable의 법안에서 벗어날 수 없습니다.즉, NSZombie Enable을 설정하지 않았을 때 위 코드가 정확한 결과를 얻을 수 있는 이유는 [array release]가 이 메모리 블록을 방출한다고 표시했지만 뒤에 array를 사용할 때 이 바늘이 가리키는 메모리 데이터가 덮어쓰이지 않았기 때문에 오류가 발생하지 않았기 때문이다. 이것은 C++의 바늘 delete 후의 효과와 같다.
4
4
4
마지막으로 NSZombie Enabled는 디버깅할 때만 사용할 수 있음을 일깨워 줍니다. 제품이 발표될 때 제거하는 것을 절대 잊지 마세요. 왜냐하면 NSZombie Enabled는 dealloc 대상의 메모리를 진정으로 방출하지 않기 때문입니다. 계속 켜면 결과는 가히 알 수 있고 자중할 수 있습니다!
본문 링크http://unmi.cc/nszombieenabled-locate-exc_bad_access-error꾀꼬리