2011-11-08 2 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에서 캡처 한 이미지의 크기는 약 8MB입니다. 그래서 한 번에 여러 개의 이미지를 캡처하고 모든 이미지가 메모리에 있으면 메모리 문제가 시작됩니다. 이미지의 크기를 조정할 수 있으며 크기를 줄이기 위해 이미지를 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

고맙소 코드를 추가했지만 여전히 메시지가 콘솔에 표시되는 crashing.These이다. 받은 메모리 경고. 수준 = 1 수신 된 메모리 warning.Level = 2 경고 : /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.3.2 (8H7) /Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib (파일을 찾을 수 없음)에 대한 기호를 읽을 수 없습니다.). – ishhhh

+0

카메라를 닫은 이미지를 캡처하거나 동일한 세션에서 여러 이미지를 캡처하는 경우 – ishhhh

+0

을 알려주십시오. – iOSPawan

관련 문제