Получите предупреждение памяти после 10 или 11 раз захвата изображения с помощью UIImagePickerControllerSourceTypeCamera в iphone - PullRequest
1 голос
/ 18 мая 2011

Привет, я получаю предупреждение о памяти, когда использую камеру.

Ошибка такая:

"Receive memory warning..."

И код:

-(void) getPhoto{

    GameAppdelegate *appDelegate = (GameAppdelegate *)[[UIApplication sharedApplication]delegate];

    UIImagePickerController * picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.allowsEditing = YES;

    ///////////////////////////////////photolibrary//////////////////////////////
    if([appDelegate.photoselection isEqualToString:@"User Pressed Button 1\n"])
    {
        picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;

        if(appDelegate.sound == 1)
        {
            [classObj ButtonSound];
        }
    }
    ///////////////////////////////////Camera//////////////////////////////

    else if([appDelegate.photoselection isEqualToString:@"User Pressed Button 2\n"]) 
    {

        @try 
        {
            picker.sourceType = UIImagePickerControllerSourceTypeCamera;
        }
        @catch (NSException * e)
        {
            UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"ALERT" 
                                                         message:@"Please try again"
                                                        delegate:self 
                                               cancelButtonTitle:nil 
                                               otherButtonTitles:@"ok", nil];
            [av show];

        }
        if(appDelegate.sound == 1)
        {
            [classObj ButtonSound];
        }
    }
    ///////////////////////////////////Cancel//////////////////////////////


    else if([appDelegate.photoselection isEqualToString:@"User Pressed Button 3\n"]) 
    {
        if(appDelegate.sound == 1)
            [classObj ButtonSound];
        return;
    }
    [self presentModalViewController:picker animated:YES];
    [picker release];
}

Как я могу справиться с этим? Пожалуйста, помогите после съемки, я обрезать изображение и сохранить в приложении, как это:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo {

    iRolegameAppDelegate *appDelegate = (iRolegameAppDelegate *)[[UIApplication sharedApplication]delegate];

    if(appDelegate.sound == 1)
    {
        [classObj ButtonSound];
    }

    [picker dismissModalViewControllerAnimated:YES];
    imageView.image = image;
    CGSize size = [imageView.image size];
    CGRect cropRect = CGRectMake(0.0, 0.0, size.width, size.height);

    NSValue *cropRectValue = [editingInfo objectForKey:@"UIImagePickerControllerCropRect"];
    cropRect = [cropRectValue CGRectValue];

    appDelegate.slectedimage = image; 
    imageView.hidden = YES;

    if( [appDelegate.Name length] != 0 && max_att == 15)
    {
        btnNotDone.hidden   = YES;
        btnDone.enabled = YES;
    }

    //IMAGE SAVE IN DOCUMENTS//////
    [UIImagePNGRepresentation(image) writeToFile:[self findUniqueSavePath] atomically:YES];
    // Show the current contents of the documents folder
    CFShow([[NSFileManager defaultManager] directoryContentsAtPath:[NSHomeDirectory() stringByAppendingString:@"/Documents"]]);




}

Пожалуйста, помогите мне. Я хочу удалить все предупреждения.

Ответы [ 3 ]

2 голосов
/ 18 мая 2011

Вы пропускаете UIImagePickerController.Выпускать его автоматически при создании или выпускать после dismissModalViewControllerAnimated.

Вы все еще можете получать предупреждения о памяти, фотографии могут быть огромными, особенно на iPhone 4, и в определенный момент у вас есть два из них в памяти: UIImage и автоматически выпущенный PNG.

PS Вы, кажется, не используете size и cropRect, поэтому вы можете удалить их.

1 голос
/ 18 мая 2011

Отпустите ваш вид оповещения. В общем, освободите любой объект, который вы разместили. Если у вас есть свойство retain, присвойте ему объект автоматического освобождения.

Когда вы получаете предупреждение памяти, вызывается ваш метод контроллера вида - (void)didReceiveMemoryWarning. Здесь вам придется освободить любые ненужные объекты, которые вы кэшировали. Обычно это некоторые изображения, представления в стеке и т. Д.

Также проверьте, есть ли у вас подходящие релок для объектов в вашем контроллере модального представления.

0 голосов
/ 18 мая 2011

Реализуете ли вы -imagePickerController:didFinishPickingMediaWithInfo:? Реализованный вами метод устарел. Вы должны использовать другой метод даже для изображений. Что вы делаете с записанными видео?

На боковой ноте следующий код -

@try 
{
    picker.sourceType = UIImagePickerControllerSourceTypeCamera;
}
@catch (NSException * e)
{
    UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"ALERT" 
                                                message:@"Please try again"
                                               delegate:self 
                                      cancelButtonTitle:nil 
                                      otherButtonTitles:@"ok", nil];
    [av show];
}

должно быть

if ( [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] ) {
    picker.sourceType = UIImagePickerControllerSourceTypeCamera;
} else {
    UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"ALERT" 
                                                 message:@"Camera isn't available"
                                                delegate:self 
                                       cancelButtonTitle:nil 
                                       otherButtonTitles:@"ok", nil];
    [av show];
    [av release]
}

Теперь разумнее было бы отключить кнопку 2, которая будет

if ( ![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] ) {
    button2.enabled = N0;
}
...