Программа получила сигнал 0 для uiimagepickercontroller - PullRequest
0 голосов
/ 22 июня 2011

У меня есть приложение, в котором пользователь может делать снимки с камеры, и изображение отображается в режиме просмотра изображений.Он работает нормально в первый раз, но приложение во второй раз падает, оставляя уровень предупреждения о памяти = 1

Я гуглял и пробовал все возможные способы, но безрезультатно

Ниже приведен код, который я использовал вмое приложение

       UIImagePickerController *imgpicker;

        @property(nonatomic,retain) UIImagePickerController *imgpicker;



        @synthesize imgpicker;  

        if(actionSheet.tag==1)
            {
                NSLog(@"button index:%i",buttonIndex);
                if(buttonIndex == 0)
                { NSLog(@"button index for camera:%i",buttonIndex);
                    if(self.imgpicker==nil){
                    self.imgpicker=[[UIImagePickerController alloc]init];

                    self.imgpicker.delegate =self;
                    self.imgpicker.sourceType=UIImagePickerControllerSourceTypeCamera;

                    }

                    [self presentModalViewController:self.imgpicker animated:YES];


                    [imgpicker release];
                    return;

                }
}

        - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
        {
           NSLog(@"didFinishPickingMediaWithInfo editing info:%@",info);
            UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];



            imageview = [[UIImageView alloc] initWithFrame:CGRectMake(65, 10, 75, 75)];



                NSData *newjpg = UIImageJPEGRepresentation(image, 0.5);



            [imageview setImage:[UIImage imageWithData:newjpg]];



            [scrollView addSubview:imageview];



            [self.view addSubview:scrollView];

            [[picker parentViewController] dismissModalViewControllerAnimated:YES];
    }

Пожалуйста, помогите мне

Ответы [ 3 ]

1 голос
/ 22 июня 2011

Попробуйте изменить это:

self.imgpicker=[[UIImagePickerController alloc]init];

к этому:

self.imgpicker=[[[UIImagePickerController alloc]init] autorelease];

и удалите эту строку:

[imgpicker release];

Если вы показываете средство выбора изображений более одного раза, вы теряете память из представления изображений, которое выделяется каждый раз, когда средство выбора заканчивается. Вы также каждый раз добавляете представление изображения в представление прокрутки и представление прокрутки в представление контроллера представления. Вам просто нужно сделать это один раз и обновить свойство image в представлении изображения.

Попробуйте это:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSLog(@"didFinishPickingMediaWithInfo editing info:%@",info);
    UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];

    if (imageview == nil) {
        imageview = [[UIImageView alloc] initWithFrame:CGRectMake(65, 10, 75, 75)];
        [scrollView addSubview:imageview];
        [self.view addSubview:scrollView];
    }

    NSData *newjpg = UIImageJPEGRepresentation(image, 0.5);

    [imageview setImage:[UIImage imageWithData:newjpg]];

    [[picker parentViewController] dismissModalViewControllerAnimated:YES];
}
0 голосов
/ 23 июня 2011

Пожалуйста, используйте этот код:

Делегат приложения // .h

#import <UIKit/UIKit.h>

@interface MyProjectAppDelegate : NSObject <UIApplicationDelegate> {

    UIImagePickerController *image_picker;

    UIWindow *window;
    UINavigationController *navigationController;
}
@property(nonatomic, retain) UIImagePickerController *image_picker;
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;

-(void)initializeImagePickerView;

@end

// .m

#import "MyProjectAppDelegate.h"
#import "RootViewController.h"

@implementation MyProjectAppDelegate

@synthesize window;
@synthesize navigationController,image_picker;

#pragma mark -
#pragma mark Application lifecycle

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.
    [self initializeImagePickerView];

    // Set the navigation controller as the window's root view controller and display.
    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];

    return YES;
}

-(void)initializeImagePickerView
{
    // Picker View
    self.image_picker = [[UIImagePickerController alloc] init];
    self.image_picker.allowsImageEditing = YES;
}

- (void)dealloc {
    [image_picker release];
    [navigationController release];
    [window release];
    [super dealloc];
}
@end

// RootView Controller // .h

#import <UIKit/UIKit.h>
#import "MyProjectAppDelegate.h"

@interface RootViewController : UIViewController <UIImagePickerControllerDelegate,UINavigationControllerDelegate>{

    MyProjectAppDelegate *appDelegate;
}
-(IBAction)btnPhotoPressed:(id)sender;
@end

// .m

#import "RootViewController.h"
@implementation RootViewController

#pragma mark -
#pragma mark View lifecycle
- (void)viewDidLoad {
    [super viewDidLoad];

    appDelegate = (MyProjectAppDelegate *)[[UIApplication sharedApplication] delegate];
}

-(IBAction)btnPhotoPressed:(id)sender
{
    appDelegate.image_picker.sourceType=UIImagePickerControllerSourceTypePhotoLibrary;
    appDelegate.image_picker.delegate=self;
    [self presentModalViewController:appDelegate.image_picker animated:YES];
}

#pragma mark UIImagePickerController delegate
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    // Access the uncropped image from info dictionary
    UIImage *imgCapturePhoto = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

    // You can use image here

    [self dismissModalViewControllerAnimated:YES];
}
-(void)imagePickerControllerDidCancel:(UIImagePickerController *) picker
{
    [picker dismissModalViewControllerAnimated:YES];
}
- (void)dealloc {
    [super dealloc];
}

Это определенно поможет вам.

0 голосов
/ 22 июня 2011

Пожалуйста, создайте объект UIImagePickerController в вашем классе AppDelegate и инициализируйте в вашем методе AppDidFinishloading: didFinishLaunchingWithOptions. Реализовать его по методу appDelegate dealloc. Вы можете получить к нему доступ в нужной странице контроллера представления из класса appdelegate. Пожалуйста, не создавайте evertytime объект UIImagePickerController, когда вам это нужно, и перепродайте его.

Это может помочь вам.

...