2012-08-28 25 views
-1

我在ARC上使用xcode 4.4。我曾經動態創建的ViewController.m UIViews:在如何在ARC之間切換UIViews沒有內存泄漏?

UIView* myviews[10]; 

然後 - (無效)viewDidLoad中功能我每次填寫它與圖片,我需要

myviews[viewIndex] = [[UIView alloc]initWithFrame:myrec]; 
UIImage *testImg; 
UIImageView * testImgView = [[UIImageView alloc]init]; 
testImg = [UIImage imageNamed:[NSString stringWithFormat:@"imgarray%d.png", viewIndex]; 
[testImgView setImage:testImg]; 
[myviews[viewIndex] addsubView:testImgView]; 
viewindex++; 

所以,一切似乎都很正常,當我想跳,從一個視圖到另一個我這樣做有兩個按鈕旁邊:

[self.view addSubview:views[viewIndex]]; 
CATransition *animation = [CATransition animation]; 
[animation setDelegate:self]; 
[animation setDuration:1.0f]; 
[animation setType:@"rippleEffect"]; 
[animation setSubtype:kCATransitionFromTop]; 
//[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
[self.view.layer addAnimation:animation forKey:@"transitionViewAnimation"]; 

似乎沒有什麼是壞的,但內存消耗巨大的速度增長,當我視圖之間切換..然後我得到低內存警告或有時應用程序只會崩潰。

我曾嘗試使用的UIViewController陣列和控制器之間進行切換:沒什麼變化,內存不足警告是什麼我結束了..

也許我需要以某種方式清潔內存?但是如何? ARC不允許使用隔離等..

去年我曾嘗試(對不起,也許不是很專業)之前添加新的子視圖是這個

NSArray *viewsToRemove = [self.view subviews]; 
        for (UIView *views in viewsToRemove) { 
         [views removeFromSuperview]; 
        } 

但是這並沒有幫助。

編輯:我需要澄清一件事:我需要在應用程序執行過程中每個UIView,這意味着我不能在應用程序退出前釋放它。

EDIT2:編輯代碼看起來更像真實的代碼。

回答

0

的一點想法:

首先,什麼是不正確的代碼複製,因爲你永遠不會創建testImgView。取而代之的

testImgView.image = testImg; 

你需要

testImgView = [UIImageView viewWithImage:image]; 

其次,你不需要進入層動畫。 See this code instead...

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:1.0]; 
[UIView setAnimationTransition: 110 forView:view cache:NO]; //110 for ripple effect 
[UIView commitAnimations]; 

第三,你可以嘗試只添加在viewDidLoad中所有的意見與標籤,然後設置可見。

+0

我在下面回答,是的代碼只是一個例子,我如何創建圖像的UIViews。你的提示與標籤是一個好主意,但不是在我的情況下,我仍然需要動畫......它似乎不會從數組中選擇我的視圖,但每次我嘗試添加它時創建它。這是我看到的唯一合乎邏輯的答案。但我必須讓它工作。 –

+0

噢和[UIView setAnimationTransition:110 forView:view cache:NO]不適用於iOS 5.1?我剛剛嘗試過,視圖剛好改變,好像根本沒有動畫。 –

+0

對不起,我忘了addSubViews不是動畫。你需要操縱alpha。 – mackworth

0

爲什麼不使用NSMutableArray存儲您的視圖?這很容易,我敢說,更安全。

而且也,當你從上海華刪除它們,還從陣列

刪除它們作爲一般規則,請記住,將其存儲到一個數組保留它,消除它釋放它,所以如果你保存它到一個數組中,然後將它作爲子視圖添加,它將具有保留計數+2。然後你從superview中刪除它(保留count -1),但它仍然是積極的,因爲它仍然在你的數組中。

+0

好的,但如果我將來需要它,我將它從數組中移除?我如何再次訪問它? –

-1

當你使用這樣的數組結構(我假設是一個ivar)時,ARC並不真正知道它必須在包含對象的結構消失時釋放你的視圖。當你清理時,比如在你的方法-dealloc中,你需要遍歷數組並將每個元素設置爲零,然後ARC會知道釋放該視圖是可以的。另一種選擇是使用Foundation集合類型,例如NSMutableArray來保存您的視圖,這將使您不必記住清理它們。

例如:

- (void)dealloc 
{ 
    for(int i = 0; i < 10; i++) 
    myviews[i] = nil; 
} 

如果您的應用程序的生命週期中,分配新的觀點進入此陣,它的好,ARC會做正確的事。只要確保你在-dealloc無效。如果您知道以相同的方式完成了它們,也可以先釋放它們,即迭代數組並將nil分配給每個元素。

+0

賈森,我感謝你的答案,但我仍然需要在應用程序執行過程中的這些意見...我的問題是 - 當我以上述方式在視圖之間切換時,我每次從一個視圖跳轉時增加內存消耗到另一個.. –

+0

@AndreiGolubev內存消耗可能是由其他事情引起的。這10個觀點有多大?是否有可能這個控制器被創建多次並留在內存中?您需要檢查這些事情,因爲如果您只有這些簡單的10個靜態視圖,則在創建每個堆並將其至少一次插入視圖層次結構後,您不應該看到任何堆增長。 –

+0

不,控制器/ UIViews創建一次並放入一個數組,然後我只是通過[self addsubView:myviews [viewIndex]];在數組成員之間切換。圖片總共20Mb,我懷疑這可能是原因。可以嗎? –

0

如果每次發生轉換時情況都變得更糟,那麼當您從超級視圖中移除時,您可以嘗試從圖層中刪除動畫。

NSArray *viewsToRemove = [self.view subviews]; 
        for (UIView *views in viewsToRemove) { 
         [views removeFromSuperview]; 
         [views.layer removeAllAnimations]; 
        }