Проблема с UIImagePickerController

У меня проблема с представлением UIImagePickerController с помощью presentModalViewController. Как только отображается представление (будь то камера или фотоальбом), приложение вылетает.

Весь пользовательский интерфейс создается в коде, без конструктора интерфейса. Это перестало работать только с тех пор, как я обновлял код для работы на ios4. Используя утечки, я не могу их найти, а общее выделение памяти, которое я получаю, составляет около 5 МБ.

Вот код, который я использую для представления средства выбора камеры -

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePicker setDelegate:self];
[imagePicker setAllowsEditing:YES];
[imagePicker setCameraCaptureMode:UIImagePickerControllerCameraCaptureModePhoto];
[self presentModalViewController:imagePicker animated:YES];
[imagePicker release];

И делегаты в следующем -

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
  UIImage *selectedImage = [info objectForKey:UIImagePickerControllerEditedImage];
  UIImage *newImage = [self createGameImage:selectedImage];
  [gameOptionsImageDisplay setImage:[self resizeImage:newImage toSize:CGSizeMake(95, 95)]];  
  [self dismissModalViewControllerAnimated:YES];
  [mainView setFrame:CGRectMake(0, 0, 320, 480)]; 
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
  [self dismissModalViewControllerAnimated:YES];
  [mainView setFrame:CGRectMake(0, 0, 320, 480)];  
}

Установка NSZombiesEnabled на YES говорит мне -

*** -[UIImage isKindOfClass:]: message sent to deallocated instance 0x142fc0

И трассировка стека выглядит следующим образом -

0 0x313f7d7c in ___forwarding___
1 0x3138a680 in __forwarding_prep_0___
2 0x3166dad2 in -[UIImageView(UIImageViewInternal) _canDrawContent]
3 0x3166c652 in -[UIView(Internal) _didMoveFromWindow:toWindow:]
4 0x3166c50e in -[UIView(Internal) _didMoveFromWindow:toWindow:]
5 0x3166c50e in -[UIView(Internal) _didMoveFromWindow:toWindow:]
6 0x3166c50e in -[UIView(Internal) _didMoveFromWindow:toWindow:]
7 0x3166c50e in -[UIView(Internal) _didMoveFromWindow:toWindow:]
8 0x3166aa8a in -[UIView(Hierarchy) _postMovedFromSuperview:]
9 0x31672df6 in -[UIView(Hierarchy) removeFromSuperview]
10 0x316d76ee in -[UITransitionView _didCompleteTransition:]
11 0x31754556 in -[UITransitionView _transitionDidStop:finished:]
12 0x316bc97a in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:]
13 0x316bc884 in -[UIViewAnimationState animationDidStop:finished:]
14 0x33e487c0 in run_animation_callbacks
15 0x33e48662 in CA::timer_callback
16 0x313caa5a in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__
17 0x313ccee4 in __CFRunLoopDoTimer
18 0x313cd864 in __CFRunLoopRun
19 0x313768ea in CFRunLoopRunSpecific
20 0x313767f2 in CFRunLoopRunInMode
21 0x329f36ee in GSEventRunModal
22 0x329f379a in GSEventRun
23 0x316692a6 in -[UIApplication _run]
24 0x31667e16 in UIApplicationMain
25 0x00002726 in main at main.m:14

Если кто-нибудь может мне помочь, я буду бесконечно благодарен!

Спасибо,

Стюарт


person hiptomorrow    schedule 20.08.2010    source источник
comment
Я хотел бы узнать немного больше о вашем контроллере представления. Есть UIImage, который выглядит так, как будто он выпускается дважды ... есть ли какие-либо свойства UIImage в вашем контроллере представления? Кроме того, я уверен, что вы справились с этим, и это приведет к другому сообщению об ошибке, но вы знаете, что вы не можете использовать камеру на симуляторе? Лучше всего проверить возможности пользователя, иначе на iPod Touch будет сгенерировано исключение. Кроме того, можете ли вы подтвердить с помощью точек останова, что код никогда не дойдет до обратных вызовов вашего делегата?   -  person makdad    schedule 20.08.2010
comment
Думаю проблема в родителе UIViewController. Вы говорите, что создаете это программно. Можешь показать код?   -  person Stefan Arentz    schedule 20.08.2010
comment
@phooze - Да, я проверяю, доступна ли камера, прежде чем эта опция отображается, и она отлично работает. @ St3fan - код, вызывающий средство выбора, является подклассом UIViewController, он создается в делегате приложения и добавляется в окно. С тех пор я заменил средство выбора изображений новым UIViewController с одним UIView в нем с красивым красным цветом фона, и, хотя представление отображается на PresentModalViewController, оно все равно вылетает, как только оно завершает представление в окне. БАХ!   -  person hiptomorrow    schedule 20.08.2010
comment
Стюарт, спасибо за подробности. Также хочу увидеть ваш код подкласса UIViewController.   -  person makdad    schedule 23.08.2010
comment
Проблема решена. После изучения кода контроллера представления и проб и ошибок с освобождением объектов я наконец нашел виновника, но это приводит меня к вопросу ... Вызывается ли loadView, когда модальное представление отображается сверху? - Стюарт Золлингер, 0 секунд назад править   -  person hiptomorrow    schedule 25.08.2010


Ответы (1)


Я выпускал изображение, которое также выпускалось автоматически. В редких случаях код работал, но большую часть времени он падал. В версии 3.2 это не вызывало у меня никаких ошибок и не отображалось, так что есть вероятность, что он не выпускался автоматически, пока он мне все еще был нужен. Мы нашли это методом проб и ошибок.

person hiptomorrow    schedule 15.06.2011