отпустить контроллер вида и удалить вид - PullRequest
0 голосов
/ 03 июня 2011

Быстрый вопрос:

Если я использую

[someViewController.view addSubView:otherViewController.view];

, чтобы добавить представление.А затем используйте

[otherViewController.view removeFromSuperView] 

для удаления представления, мое приложение будет аварийно завершать работу, когда я вызываю [otherViewController release]

Точка сбоя находится в строке [super dealloc] в моем методе deallocotherViewControll реализация класса.

otherViewController - это ссылка на контроллер представления.Я вызываю release после того, как его представление было удалено из FromSuperView.К тому времени, когда я вызываю релиз, это действительный указатель.

Что я здесь не так делаю?

Реализация класса dealloc для другогоViewController

- (void)dealloc {
    [popVC release];
    [photoContainer release];
    [photoView release];
    [recordName release];
    [recordIngr release];
    [recordDesc release];
    [recordPrice release];
    [quantity release];
    [pricingLabel release];
    [increaseButton release];
    [decreaseButton release];

    [pricingTableVC release];
    [pricingTable release];

    [super dealloc];   // <--- crash point
}

Обновлено: трассировка вызовов

2011-06-04 00:35:05.110 MyApp[2308:207] -[__NSCFType _viewDelegate]: unrecognized selector sent to instance 0x4b6feb0
2011-06-04 00:35:05.124 MyApp[2308:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType _viewDelegate]: unrecognized selector sent to instance 0x4b6feb0'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x00dd75a9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x00f2b313 objc_exception_throw + 44
    2   CoreFoundation                      0x00dd90bb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x00d48966 ___forwarding___ + 966
    4   CoreFoundation                      0x00d48522 _CF_forwarding_prep_0 + 50
    5   UIKit                               0x00379051 -[UIViewController dealloc] + 128
    6   MyApp                              0x00009b26 -[RecordDetailViewController dealloc] + 797
    7   MyApp                              0x00004744 __-[RecordRootViewController bringUpNextRecordDetail:isNext:]_block_invoke_2 + 77
    8   UIKit                               0x002f7fb9 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 294
    9   UIKit                               0x002f7e4b -[UIViewAnimationState animationDidStop:finished:] + 77
    10  QuartzCore                          0x01d7b99b _ZL23run_animation_callbacksdPv + 278
    11  QuartzCore                          0x01d20651 _ZN2CAL14timer_callbackEP16__CFRunLoopTimerPv + 157
    12  CoreFoundation                      0x00db88c3 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19
    13  CoreFoundation                      0x00db9e74 __CFRunLoopDoTimer + 1220
    14  CoreFoundation                      0x00d162c9 __CFRunLoopRun + 1817
    15  CoreFoundation                      0x00d15840 CFRunLoopRunSpecific + 208
    16  CoreFoundation                      0x00d15761 CFRunLoopRunInMode + 97
    17  GraphicsServices                    0x0172e1c4 GSEventRunModal + 217
    18  GraphicsServices                    0x0172e289 GSEventRun + 115
    19  UIKit                               0x002d5c93 UIApplicationMain + 1160
    20  MyApp                              0x0000200c main + 102
    21  MyApp                              0x00001f9d start + 53
)
terminate called after throwing an instance of 'NSException'

Обновить : в -viewDidLoad у меня есть распознаватель жестов:

{
    UISwipeGestureRecognizer *leftSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(showNextRecod:)];
    [leftSwipeGestureRecognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
    [self.view addGestureRecognizer:leftSwipeGestureRecognizer];
    [leftSwipeGestureRecognizer release];

}

Я пытался использовать кнопку для вызова - (IBAction) showNextRecod, это не приведет к сбою !! * Только 1033 *когда я использую жест для вызова того же метода, он вылетает

С уважением

Лев

Ответы [ 3 ]

3 голосов
/ 03 июня 2011

Когда вы добавляете представление контроллера представления как подпредставление к другому представлению, вы сохраняете только его представление в памяти, а не сам контроллер.Следовательно, вы должны сохранить контроллер представления в другом месте (скорее всего, сделать его свойством)

Имеет ли это смысл?

1 голос
/ 10 декабря 2012

@ leo. Вы просто добавляете otherViewController.view в someViewController.view.

Просто добавляете представление, не выделяя его, а затем просто удаляете из представления.

Я не понимаю, почему вы используете [otherViewController release] , когда вы не выделяете его в том же представлении.

Обязательно вы можете зарегистрировать countViewViewController.view.Посмотрите, сколько осталось для этого представления.

1 голос
/ 10 декабря 2012

В вашем жесте селектор showNextRecod:
Вы должны удалить свою цель [pGestureRecognizer removeTarget:nil action:NULL];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...