2011-11-08 113 views
0

我正在開發一個照片應用程序的應用程序。用戶可以選擇從相機和photolibray中選擇照片。通過相機拍照導致應用程序崩潰

照片庫運行良好。

但是,當我試圖從相機拍攝照片它墜毀。

崩潰後,將其表示控制檯消息「接收到的存儲器的警告。等級= 1

接收的存儲器的警告。級別= 2」。

我用下面的下面的代碼(開源),通過攝像頭拍照:

#import "OverlayViewController.h" 

enum 
{ 
    kOneShot,  // user wants to take a delayed single shot 
    kRepeatingShot // user wants to take repeating shots 
}; 

@implementation OverlayViewController 

@synthesize delegate, takePictureButton, startStopButton, 
      cancelButton, timedButton, 
      tickTimer, cameraTimer, 
      imagePickerController; 


#pragma mark - 
#pragma mark OverlayViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) 
    { 
     AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath: 
                [[NSBundle mainBundle] pathForResource:@"tick" 
                        ofType:@"aiff"]], 
             &tickSound); 

     self.imagePickerController = [[[UIImagePickerController alloc] init] autorelease]; 
     self.imagePickerController.delegate = self; 
    } 
    return self; 
} 

- (void)viewDidUnload 
{ 
    self.takePictureButton = nil; 
    self.startStopButton = nil; 
    self.timedButton = nil; 
    self.cancelButton = nil; 

    self.cameraTimer = nil; 

    [super viewDidUnload]; 
} 

- (void)dealloc 
{ 
    [takePictureButton release]; 
    [startStopButton release]; 
    [cancelButton release]; 
    [timedButton release]; 

    [imagePickerController release]; 
    AudioServicesDisposeSystemSoundID(tickSound); 

    [cameraTimer release]; 
    [tickTimer release]; 

    [super dealloc]; 
} 

- (void)setupImagePicker:(UIImagePickerControllerSourceType)sourceType 
{ 
    self.imagePickerController.sourceType = sourceType; 

    if (sourceType == UIImagePickerControllerSourceTypeCamera) 
    { 
     // user wants to use the camera interface 
     // 
     self.imagePickerController.showsCameraControls = NO; 

     if ([[self.imagePickerController.cameraOverlayView subviews] count] == 0) 
     { 

      CGRect overlayViewFrame = self.imagePickerController.cameraOverlayView.frame; 
      CGRect newFrame = CGRectMake(0.0, 
             CGRectGetHeight(overlayViewFrame) - 
             self.view.frame.size.height - 10.0, 
             CGRectGetWidth(overlayViewFrame), 
             self.view.frame.size.height + 10.0); 
      self.view.frame = newFrame; 
      [self.imagePickerController.cameraOverlayView addSubview:self.view]; 
     } 
    } 
} 

// called when the parent application receives a memory warning 
- (void)didReceiveMemoryWarning 
{ 
    // we have been warned that memory is getting low, stop all timers 
    // 
    [super didReceiveMemoryWarning]; 

    // stop all timers 
    [self.cameraTimer invalidate]; 
    cameraTimer = nil; 

    [self.tickTimer invalidate]; 
    tickTimer = nil; 
} 

// update the UI after an image has been chosen or picture taken 
// 
- (void)finishAndUpdate 
{ 
    [self.delegate didFinishWithCamera]; // tell our delegate we are done with the camera 

    // restore the state of our overlay toolbar buttons 
    self.cancelButton.enabled = YES; 
    self.takePictureButton.enabled = YES; 
    self.timedButton.enabled = YES; 
    self.startStopButton.enabled = YES; 
    self.startStopButton.title = @"Start"; 
} 


#pragma mark - 
#pragma mark Camera Actions 

- (IBAction)done:(id)sender 
{ 
    // dismiss the camera 
    // 
    // but not if it's still taking timed pictures 
    if (![self.cameraTimer isValid]) 
     [self finishAndUpdate]; 
} 

// this will take a timed photo, to be taken 5 seconds from now 
// 
//- (IBAction)timedTakePhoto:(id)sender 
//{ 
// // these controls can't be used until the photo has been taken 
// self.cancelButton.enabled = NO; 
// self.takePictureButton.enabled = NO; 
// self.timedButton.enabled = NO; 
// self.startStopButton.enabled = NO; 
// 
// if (cameraTimer != nil) 
//  [cameraTimer invalidate]; 
// cameraTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 
//             target:self 
//             selector:@selector(timedPhotoFire:) 
//             userInfo:[NSNumber numberWithInt:kOneShot] 
//             repeats:YES]; 
// 
// // start the timer to sound off a tick every 1 second (sound effect before a timed picture is taken) 
// if (tickTimer != nil) 
//  [tickTimer invalidate]; 
// tickTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 
//             target:self 
//             selector:@selector(tickFire:) 
//             userInfo:nil 
//             repeats:YES]; 
//} 

- (IBAction)takePhoto:(id)sender 
{ 
    [self.imagePickerController takePicture]; 
} 

- (IBAction)startStop:(id)sender 
{ 
    if ([self.cameraTimer isValid]) 
    { 
     // stop and reset the timer 
     [self.cameraTimer invalidate]; 
     cameraTimer = nil; 

     [self finishAndUpdate]; 
    } 
    else 
    { 

     self.startStopButton.title = @"Stop"; 
     self.cancelButton.enabled = NO; 
     self.timedButton.enabled = NO; 
     self.takePictureButton.enabled = NO; 

     cameraTimer = [NSTimer scheduledTimerWithTimeInterval:1.5 // fire every 1.5 seconds 
                 target:self 
                selector:@selector(timedPhotoFire:) 
                userInfo:[NSNumber numberWithInt:kRepeatingShot] 
                 repeats:YES]; 
     [cameraTimer fire]; // start taking pictures right away 
    } 
} 


#pragma mark - 
#pragma mark Timer 

// gets called by our repettive timer to take a picture 
- (void)timedPhotoFire:(NSTimer *)timer 
{ 
    [self.imagePickerController takePicture]; 

    NSInteger cameraAction = [self.cameraTimer.userInfo integerValue]; 
    switch (cameraAction) 
    { 
     case kOneShot: 
     { 
      // timer fired for a delayed single shot 
      [self.cameraTimer invalidate]; 
      cameraTimer = nil; 

      [self.tickTimer invalidate]; 
      tickTimer = nil; 

      break; 
     } 

     case kRepeatingShot: 
     { 
      // timer fired for a repeating shot 
      break; 
     } 
    } 
} 

// gets called by our delayed camera shot timer to play a tick noise 
- (void)tickFire:(NSTimer *)timer 
{ 
    AudioServicesPlaySystemSound(tickSound); 
} 


#pragma mark - 
#pragma mark UIImagePickerControllerDelegate 

// this get called when an image has been chosen from the library or taken from the camera 
// 
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage]; 

    // give the taken picture to our delegate 
    if (self.delegate) 
     [self.delegate didTakePicture:image]; 

    if (![self.cameraTimer isValid]) 
     [self finishAndUpdate]; 
} 

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker 
{ 
    [self.delegate didFinishWithCamera]; // tell our delegate we are finished with the picker 
} 

@end 

誰能請幫助我如何提前解決這個issue.Thanks。

回答

0

這是因爲內存問題。試試這個 -

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    NSAutoreleasePool *thePool = [[NSAutoreleasePool alloc]init]; 
    UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage]; 

    // give the taken picture to our delegate 
    if (self.delegate) 
     [self.delegate didTakePicture:image]; 

    if (![self.cameraTimer isValid]) 
     [self finishAndUpdate]; 
    [thePool release]; 
} 

從camaera拍攝的圖像大小爲8 MB左右。因此,如果您一次捕獲多個圖像,並且所有圖像都在內存中,則內存問題將開始合併。您可以調整圖像大小,然後將圖像轉換爲JPEG格式以縮小圖像大小。

調整圖像大小 -

+ (UIImage*)imageWithImage:(UIImage*)image 
       scaledToSize:(CGSize)newSize; 
{ 
    UIGraphicsBeginImageContext(newSize); 
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; 
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return newImage; 
} 
+0

Thankyou.I加入你的代碼,但仍是crashing.These消息顯示在控制檯中。收到內存警告。 Level = 1Received memory warning.Level = 2 警告:無法讀取/Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.3.2(8H7)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib的符號(未找到文件)。 – ishhhh

+0

當您捕捉關閉相機的圖像或者您在同一會話中捕捉多個圖像時,請幫助我請 – ishhhh

+0

。 – iOSPawan