2012-11-15 112 views
3

我創建了一個帶主視圖和模式視圖的圖像展示應用程序,圖像輪播作爲屏幕保護程序。每當觸摸屏幕時,該模式視圖就會滑落。閃爍UIImageView

如果設備在應用程序運行時獨自呆了很長時間(過夜),則在屏幕保護程序模式啓動時屏幕會重繪問題。它看起來像操作系統沒有畫主屏幕的背景圖像。主屏幕上的控件和文本應該像他們應該畫的那樣,只有背景圖像被來自模態的隱藏動畫的僞影所取代。這發生在兩臺設備(iPad 2 3G 16GB)上。只有當應用程序運行了很長時間纔會發生這種情況,並且屏幕是否打開也無關緊要。有問題的背景UIImageView是一個vanilla UIImageView,除了「Image」被改變之外沒有任何屬性。

它看起來像這樣(客戶端的標誌和一些文字模糊了):http://tinypic.com/view.php?pic=2qx47bt&s=6

的東西可能是錯誤的任何想法,如何解決?

編輯: 這是隱藏屏幕保護程序的代碼。非常標準,沒有hocus pocus。

- (void)hideScreenSaver { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     if (![[[self mainViewController] presentedViewController] isKindOfClass:[UINavigationController class]]) { 
      [[self mainViewController] dismissModalViewControllerAnimated:TRUE]; 
     } 
    }); 
} 

的screensaverViewController在創建 - (BOOL)申請:(UIApplication的*)應用程序didFinishLaunchingWithOptions:(NSDictionary的*)launchOptions(在主線程)

[[GMAppManager sharedManager] setScreenSaverViewController:[[AAScreenSaverViewController alloc] initWithNibName:@"AAScreenSaverViewController" bundle:nil]]; 
+0

你可以發佈一些與動畫相關的代碼嗎? –

+2

@MarceloFabri我在上面添加了一些代碼,但沒有什麼奇怪的事情發生在那裏。 –

+0

爲什麼你需要dispatch_async?如果你不使用它會發生什麼? – meronix

回答

2

`我絕對有這個問題在這只是一個uikit資源泄漏。運行構建並分析和修復泄漏。還要在所有的deallocs上設置斷點並確保它們正在被調用。如果保留一個對類的一部分的引用並且不釋放,則dealloc不會被調用。檢查您傳遞參數的所有對象:self。如果使用self的對象沒有釋放,則這些對自身的引用也會阻塞dealloc。如果環路很緊,Autorelease池不會流失。嘗試使用顯式版本。 Delgates需要分配而不是保留。

發佈一些更多的錯誤和問題,我看看。你有一個很酷的項目。

+0

不幸的是我在這裏使用ARC,所以我從不顯式釋放任何東西。我如何將您的答案應用於ARC? –

+0

即使您使用ARC,內存管理也會繼續使用alloc/release(但會自動完成)。如果您的代碼中發生「有些奇怪」,則對象可能無法正確釋放。 (剛剛發生在我的一個項目中:-)只需重寫對象的dealloc方法(省略[super dealloc]方法)並設置一個斷點。這會讓你知道對象在使用後是否被正確解除分配。而且,使用儀器和分配工具來監視內存使用情況。 – LombaX

+0

- (void)dealloc {NSLog(@「嘿,我們從內存中解脫出來,現在清除了所有的CF保留」)} //斷點並且應該被擊中,如果沒有,那麼你仍然有強烈的參考你的對象。 – nolimitsdude

2

當你說

有問題的背景是UIImageView的一個香草的UIImageView與 比「形象」改變其他任何屬性。

你能確保你在清除UIImageView第一,改變Image

之前,我相信,你一定要知道。但是,以防萬一,你可以試試看:

youeImageView.image = nil然後設置一些其他圖像?

通過看到你提供的圖像,原因似乎不是別的,恕我直言。

+2

謝謝,我試試,然後回報。 –

+0

確保代表不強。檢查所有屬性與強大的參考,並確保你沒有財產保留強。一個應該是弱的,所以它可以被釋放,並允許強者也被釋放。當班級從內存中移除時。檢查儀器中的分配情況,看看運行後還有什麼活動。如果你的屏幕保護程序運行後,所有的東西都應該是內存不足,並且它們仍然存在,那麼這是一個有力的參考。 – nolimitsdude

+0

你也可以進行測試,看看你是否加載類,然後退出,保持對類的強烈引用應該消失。在樂器中查看仍然存在的對象的狀態。 – nolimitsdude