2011-08-27 61 views
0

对我有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 

感谢

回答

1

RecordViewController声明为单(Apple docs on Singletons)的代码。拥有一个singleton视图控制器永远不会有意义,但我会忽略它,只是帮助你。

您得到该例外的原因是因为您要拨打[RecordViewController alloc]两次。它应该只被调用一次,因为它是一个单身人士。

要解决这个问题,您需要每次打电话[RecordViewController sharedInstance]与班级互动,而不是像您可能习惯的[[RecordViewController alloc] init]

+0

Recordviewcontroller,有一个录音机 - 我正在使用一个单身人士,因为这使我可以在录音时切换视图。那么我需要删除或调用哪些特定的代码?谢谢 – LA12

+0

我不能具体在哪里你需要修改你的代码,但看看异常,我可以看到有一个地方 [EffectsViewController goRecord] 只需通过你的代码并替换[[RecordViewController alloc] init]与[RecordViewController sharedInstance] –

+0

好吧,我已经改变了。但是现在,当我尝试进入它时,我收到'节目接收信号:“EXC_BAD_ACCESS”。 数据格式化程序暂时不可用,将在“继续”后重新尝试。 (正在调试的程序在从GDB调用的函数中发出信号 GDB已将上下文恢复到调用前的状态 要更改此行为,请使用“set unwindonsignal off” 评估包含该函数的表达式(gdb_objc_startDebuggerMode )将被放弃)':( – LA12

相关问题