对,我有5个意见。视图之一称为RecordViewController。 (RecordViewController导致错误)我可以在视图之间切换。但是一旦进入recordviewcontroller,就可以切换到另一个视图。但是如果我想切换回recordviewcontroller。它把我赶出了我的应用程序,并给我这个错误:

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)。拥有单例视图控制器绝对没有任何意义,但我将忽略它,只是为您提供帮助。

得到该异常的原因是因为您两次调用[RecordViewController alloc]。因为它是单例,所以只能调用一次。

要解决该问题,您需要在每次要与该类进行交互时调用[RecordViewController sharedInstance],而不是像您习惯的那样[[RecordViewController alloc] init]

10-07 19:55