终止应用程序由于未捕获的异常'NSInternalInconsistencyException'
问题描述:
对我有5意见。其中一个视图叫做RecordViewController。 (RecordViewController导致错误)我可以很好地切换视图。但是一旦我进入了recordviewcontroller,我可以切换到另一个视图。但是,如果我想切换回recordviewcontroller。它抛出我出我的应用程序,并给了我这个错误:终止应用程序由于未捕获的异常'NSInternalInconsistencyException'
2011-08-27 19:52:00.358 app[1737:707] *** Assertion failure in +[RecordViewController alloc], /Users/user/Desktop/app/Classes/RecordViewController.m:111
2011-08-27 19:52:00.373 app[1737:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempted to allocated second singleton RecordViewController'
*** Call stack at first throw:
(
0 CoreFoundation 0x36fd064f __exceptionPreprocess + 114
1 libobjc.A.dylib 0x34229c5d objc_exception_throw + 24
2 CoreFoundation 0x36fd0491 +[NSException raise:format:arguments:] + 68
3 Foundation 0x353d0573 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 62
4 app 0x00014bdd +[RecordViewController alloc] + 212
5 app 0x00013fd3 -[EffectsViewController goRecord:] + 34
6 CoreFoundation 0x36f40571 -[NSObject(NSObject) performSelector:withObject:withObject:] + 24
7 UIKit 0x35dd2ec9 -[UIApplication sendAction:to:from:forEvent:] + 84
8 UIKit 0x35dd2e69 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 32
9 UIKit 0x35dd2e3b -[UIControl sendAction:to:forEvent:] + 38
10 UIKit 0x35dd2b8d -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 356
11 UIKit 0x35dd283b -[UIControl touchesBegan:withEvent:] + 186
12 UIKit 0x35dd1bb1 -[UIWindow _sendTouchesForEvent:] + 300
13 UIKit 0x35dd156f -[UIWindow sendEvent:] + 262
14 UIKit 0x35dba313 -[UIApplication sendEvent:] + 298
15 UIKit 0x35db9c53 _UIApplicationHandleEvent + 5090
16 GraphicsServices 0x366f4e77 PurpleEventCallback + 666
17 CoreFoundation 0x36fa7a97 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 26
18 CoreFoundation 0x36fa983f __CFRunLoopDoSource1 + 166
19 CoreFoundation 0x36faa60d __CFRunLoopRun + 520
20 CoreFoundation 0x36f3aec3 CFRunLoopRunSpecific + 230
21 CoreFoundation 0x36f3adcb CFRunLoopRunInMode + 58
22 GraphicsServices 0x366f441f GSEventRunModal + 114
23 GraphicsServices 0x366f44cb GSEventRun + 62
24 UIKit 0x35de4d69 -[UIApplication _run] + 404
25 UIKit 0x35de2807 UIApplicationMain + 670
26 app 0x00002e73 main + 70
27 app 0x00002e28 start + 40
)
terminate called after throwing an instance of 'NSException'
这里是recordviewcontroller
-(void)countUp {
mainInt += 1;
seconds.text = [NSString stringWithFormat:@"%02d", mainInt];
}
-(IBAction)goBack:(id)sender; {
[self dismissModalViewControllerAnimated:YES];
}
static RecordViewController *sharedInstance = nil;
+(RecordViewController *) sharedInstance {
@synchronized([RecordViewController class])
{
if (!sharedInstance)
{
[[self alloc]init];
}
return sharedInstance;
}
return nil;
}
+(id) alloc
{
@synchronized([RecordViewController class])
{
NSAssert(sharedInstance == nil, @"Attempted to allocated second singleton RecordViewController");
sharedInstance = [super alloc];
return sharedInstance;
}
return nil;
}
- (id)autorelease {
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
toggle = YES;
btnPlay.hidden = YES;
AVAudioSession * audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error: &error];
[audioSession setActive:YES error: &error];
}
- (IBAction) start_button_pressed{
if(toggle)
{
toggle = NO;
[actSpinner startAnimating];
[btnStart setImage:[UIImage imageNamed:@"recordstop.png"] forState:UIControlStateNormal];
mainInt = 0;
theTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(countUp) userInfo:nil repeats:YES];
btnPlay.enabled = toggle;
btnPlay.hidden = !toggle;
NSMutableDictionary* recordSetting = [[NSMutableDictionary alloc] init];
[recordSetting setValue :[NSNumber numberWithInt:kAudioFormatAppleIMA4] forKey:AVFormatIDKey];
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
[recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];
recordedTmpFile = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent: [NSString stringWithFormat: @"%.0f.%@", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"caf"]]];
NSLog(@"Using File called: %@",recordedTmpFile);
recorder = [[ AVAudioRecorder alloc] initWithURL:recordedTmpFile settings:recordSetting error:&error];
[recorder setDelegate:self];
[recorder prepareToRecord];
[recorder record];
}
else
{
toggle = YES;
[actSpinner stopAnimating];
[btnStart setImage:[UIImage imageNamed:@"recordrecord.png"] forState:UIControlStateNormal];
btnPlay.enabled = toggle;
btnPlay.hidden = !toggle;
[theTimer invalidate];
NSLog(@"Using File called: %@",recordedTmpFile);
[recorder stop];
}
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
-(IBAction) play_button_pressed{
AVAudioPlayer * avPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:recordedTmpFile error:&error];
[avPlayer prepareToPlay];
[avPlayer play];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}
- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
//Clean up the temp file.
NSFileManager * fm = [NSFileManager defaultManager];
[fm removeItemAtPath:[recordedTmpFile path] error:&error];
//Call the dealloc on the remaining objects.
[recorder dealloc];
recorder = nil;
recordedTmpFile = nil;
}
- (void)dealloc {
[super dealloc];
}
@end
感谢
答
RecordViewController声明为单(Apple docs on Singletons)的代码。拥有一个singleton视图控制器永远不会有意义,但我会忽略它,只是帮助你。
您得到该例外的原因是因为您要拨打[RecordViewController alloc]
两次。它应该只被调用一次,因为它是一个单身人士。
要解决这个问题,您需要每次打电话[RecordViewController sharedInstance]
与班级互动,而不是像您可能习惯的[[RecordViewController alloc] init]
。
Recordviewcontroller,有一个录音机 - 我正在使用一个单身人士,因为这使我可以在录音时切换视图。那么我需要删除或调用哪些特定的代码?谢谢 – LA12
我不能具体在哪里你需要修改你的代码,但看看异常,我可以看到有一个地方 [EffectsViewController goRecord] 只需通过你的代码并替换[[RecordViewController alloc] init]与[RecordViewController sharedInstance] –
好吧,我已经改变了。但是现在,当我尝试进入它时,我收到'节目接收信号:“EXC_BAD_ACCESS”。 数据格式化程序暂时不可用,将在“继续”后重新尝试。 (正在调试的程序在从GDB调用的函数中发出信号 GDB已将上下文恢复到调用前的状态 要更改此行为,请使用“set unwindonsignal off” 评估包含该函数的表达式(gdb_objc_startDebuggerMode )将被放弃)':( – LA12