Autorelease MKMapView nie wywołuje dealloc po pojawieniu się UIViewController
Mam następujący kod w klasie A:
UIViewController *vc = [self viewControllerForItem:item];
gdzie metoda viewControllerForItem w moim delegacie aplikacji zwraca kontroler UIViewController oparty na moim elemencie, tj.
vc = [[[MyCustomViewController alloc] init] autorelease];
return vc;
Następnie naciskam kontroler widoku:
[self.navigationController pushViewController:vc animated:YES];
Ten VC próbuję wypchnąć to MKMapView i wstawiłem instrukcję log w metodzie dealloc, aby sprawdzić, czy jest wywoływana. W moim wykorzystaniu pamięci wzrost rośnie bardzo szybko.
Jednak po dodaniu następującego kodu po naciśnięciu VC:
[vc release];
moja klasa MKMapView wywołuje metodę dealloc.
Oczywiście byłoby to proste rozwiązanie, gdyby klasa MKMapView była jedyną klasą zwróconą przez delegata aplikacji (lub mogłem sprawdzić, czy klasa VC jest moją klasą MKMapView). Chciałbym jednak rozwiązać główny problem tego.
Dlaczego dealloc nie jest wywoływany, jeśli ustawię autorelease na moim kontrolerze widoku?
Jak to możliwe, że mogę dodać [vc release] do kontrolera widoku, mimo że autorelease jest używana w tym vc?
Dzięki
Edytować:
Oto kilka dodatkowych informacji. Mam delegację viewControllerForItem w moim delegacie aplikacji. Zwracam automatycznie zwolniony obiekt do mojej innej klasy menedżera, gdzie następnie naciskam kontroler widoku. Czy liczba zatrzymanych jest pomieszana, gdy zwracam obiekt autoreleased, a następnie wypycham go w innej klasie?
Jest to backtrace / callstack tuż po naciśnięciu VC i kiedy didDissappear mkmapview's nazywa się:
pushVC: (
0 NewHampshire 0x00254cdf -[CustomViewController navigateToRowId:withLinkBehavior:animated:] + 2111
1 NewHampshire 0x002534c9 -[CustomViewController webView:shouldStartLoadWithRequest:navigationType:] + 841
2 UIKit 0x02caf288 -[UIWebView webView:decidePolicyForNavigationAction:request:frame:decisionListener:] + 318
3 UIKit 0x02cb1854 -[UIWebViewWebViewDelegate webView:decidePolicyForNavigationAction:request:frame:decisionListener:] + 77
4 CoreFoundation 0x05d0bd1d __invoking___ + 29
5 CoreFoundation 0x05d0bc2a -[NSInvocation invoke] + 362
6 CoreFoundation 0x05d0bdaa -[NSInvocation invokeWithTarget:] + 74
7 WebKit 0x0a4d811d -[_WebSafeForwarder forwardInvocation:] + 157
8 CoreFoundation 0x05d076da ___forwarding___ + 458
9 CoreFoundation 0x05d074ee _CF_forwarding_prep_0 + 14
10 CoreFoundation 0x05d0bd1d __invoking___ + 29
11 CoreFoundation 0x05d0bc2a -[NSInvocation invoke] + 362
12 WebCore 0x09533b29 _ZL20HandleDelegateSourcePv + 121
13 CoreFoundation 0x05ca083f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
14 CoreFoundation 0x05ca01cb __CFRunLoopDoSources0 + 235
15 CoreFoundation 0x05cbd29e __CFRunLoopRun + 910
16 CoreFoundation 0x05cbcac3 CFRunLoopRunSpecific + 467
17 CoreFoundation 0x05cbc8db CFRunLoopRunInMode + 123
18 GraphicsServices 0x059749e2 GSEventRunModal + 192
19 GraphicsServices 0x05974809 GSEventRun + 104
20 UIKit 0x02a6ed3b UIApplicationMain + 1225
21 NewHampshire 0x000150dd main + 125
22 libdyld.dylib 0x04fab70d start + 1
)
disappear: (
0 NewHampshire 0x0014631d -[CustomAdvancedGPSMapViewController viewDidDisappear:] + 173
1 UIKit 0x02b85bac -[UIViewController _setViewAppearState:isAnimating:] + 341
2 UIKit 0x02b86328 -[UIViewController __viewDidDisappear:] + 150
3 UIKit 0x02b86461 -[UIViewController _endAppearanceTransition:] + 306
4 UIKit 0x02ba549a -[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:] + 738
5 UIKit 0x02b9d403 __49-[UINavigationController _startCustomTransition:]_block_invoke + 206
6 UIKit 0x03176740 -[_UIViewControllerTransitionContext completeTransition:] + 99
7 UIKit 0x02a63454 __53-[_UINavigationParallaxTransition animateTransition:]_block_invoke105 + 680
8 UIKit 0x02ad1005 -[UIViewAnimationBlockDelegate _didEndBlockAnimation:finished:context:] + 306
9 UIKit 0x02abac6c -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 267
10 UIKit 0x02abaf58 -[UIViewAnimationState animationDidStop:finished:] + 80
11 QuartzCore 0x028b2a44 _ZN2CA5Layer23run_animation_callbacksEPv + 304
12 libdispatch.dylib 0x04d194b0 _dispatch_client_callout + 14
13 libdispatch.dylib 0x04d0775e _dispatch_main_queue_callback_4CF + 340
14 CoreFoundation 0x05d7ca5e __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 14
15 CoreFoundation 0x05cbd6bb __CFRunLoopRun + 1963
16 CoreFoundation 0x05cbcac3 CFRunLoopRunSpecific + 467
17 CoreFoundation 0x05cbc8db CFRunLoopRunInMode + 123
18 GraphicsServices 0x059749e2 GSEventRunModal + 192
19 GraphicsServices 0x05974809 GSEventRun + 104
20 UIKit 0x02a6ed3b UIApplicationMain + 1225
21 NewHampshire 0x0001507d main + 125
22 libdyld.dylib 0x04fab70d start + 1
)
Rozwiązanie: Chociaż odpowiedzi w tym poście nie stanowiły dokładnego rozwiązania mojego problemu, Darren zdecydowanie kierował mnie we właściwym kierunku za pomocą narzędzia do instrumentów. Uważam, że winowajcą jest obiekt CABasicAnimation, który nie został prawidłowo zwolniony.
w metodzie viewWillDisappear dodałem następujące polecenie dla obiektu CABasicAnimation:
self.rotationAnimation.delegate = nil;
self.rotationAnimation = nil;