2013-12-08 11 views
8

Etkileşimli bir geçiş iptal edildiğinde, sunulan görüntü denetleyici hiçbir zaman serbest bırakılmaz (dealloc asla çağrılmaz). Etkileşimli bir geçiş başarılı bir şekilde tamamlandığında, her şey iyidir, ancak bu geçiş iptal edildiğinde, hedef görüntü denetleyicisinin hiçbir zaman serbest bırakılmadığı görülür. Sonuç hafıza kaybıdır, ancak bellek sızıntısı değildir (en azından Enstrümanlar tarafından tespit edilmez). Yanlış bir şeyler yapıyorum ama bunun ne olduğunu görmüyorum. Başka birinin bu sorunu yaşadığına dair herhangi bir kanıt bulamadığım için, bence bu benim.iOS 7 Etkileşimli geçişin iptali, sunulan görüntü denetleyicisini serbest bırakmayı başaramadı

Sorunu gösteren çok küçük bir örnek projem var (https://github.com/mparma-isi/InteractiveTransitionIssue.git). Kırmızı karedeki bir dokunuş, ikinci görüntü denetleyicisine geçiş yapar. İkinci denetleyicideki bir musluk, denetleyiciyi birinciye geri gönderir. İlk görüntü denetleyicinin kırmızı karesinin içindeki bir tutam jest, UIPercentDrivenInteractiveTransition kullanarak etkileşimli bir geçişi başlatır. Geçişi iptal ederseniz (tutamın negatif hızı), sunulan görüntü denetleyici serbest bırakılmaz. Geçişi tamamlarsanız, tüm beklendiği gibi çalışır.

Yardımlarınız için şimdiden teşekkür ederiz. Mike

+0

Sanırım cevap vermek için biraz geciktim ama bu konuda da yaşıyorum. Aslında, bulabildiğim tüm örneklerde var, bu yüzden bunun bir UIKit hatası olduğunu varsaymak güvenli. Belki bir çözüm buldun mu? – Nicky

+0

hala doğru, herhangi bir değişiklik? –

cevap

0

yüzden Kaçaklar aletle bu profilli ve ilginç bir şey buldum: bellek sızıntısı vurgulanan hattan geldiğini görünüyor

Leaks instrument trace

. Hiçbir yerde -[UIWindow _remoteRotationViewController:] numaralı arama yok (her neyse), bu nedenle pencere sunulan görüntü denetleyicimizi canlı tutuyor.

oldukça çirkin olsa da, bu geçici çözüm benim için hile yapar: Bunun için bir Radar dosya gidiyorum

- (void)animationEnded:(BOOL)transitionCompleted { 
    if (!transitionCompleted) { 
     UIViewController *viewController = ...; // get the presented view controller 

     UIWindow *window = [UIApplication sharedApplication].keyWindow; 
     SEL selector = NSSelectorFromString(@"_removeRotationViewController:"); 
     if ([window respondsToSelector:selector]) { 
#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Warc-performSelector-leaks" 
      [window performSelector:selector withObject:viewController]; 
#pragma clang diagnostic pop 
     } 
    } 
} 

.