2010-08-15 85 views
1

我發佈了一個圖像[myimageview.image release];iphone對象c是已發佈對象

但是在應用程序在後臺後它再次出現前景,它再次釋放該圖像,所以它崩潰!我所有的嘗試來檢查應用程序是否來自背景沒有奏效。 那麼我怎麼能檢查一個對象是否已經發布..所以我不這樣做兩次?

thankx 克里斯

編輯 經過多次抱怨我的壞編碼:)這裏一個例子:

首先,我初始化路徑數組來了很多全屏圖像 也有10左右10種不同場景的不同陣列。 當我直接將圖像放入數組中時,它只需要從一開始就記憶很多內存,或者當我釋放一個場景時,它需要重新加載整個圖像數組,並且速度變慢。所以我只是將圖像的路徑加載到數組中,並在運行時將每個圖像循環分配給我的圖像視圖。

初始化一次: imageArray_stand = [[NSArray中的alloc] initWithObjects: @ 「FrankieArmeRaus_0001.jpg」, ...直到60個圖像 @ 「FrankieArmeRaus_0061.jpg」,零]。

在循環多數民衆贊成所謂的每1/10秒:

 if ([myimageview.image retainCount] > 1) 
     //if (myimageview.image != nil) // does not work = crash 
     { 
      [myimageview.image release]; 
       myimageview.image = nil; 
     } 

     myimageview.image = [UIImage imageNamed:[imageArray_stand2 objectAtIndex:piccounter-1]]; 

問題就來了,因爲當應用程序進入後臺,比到前臺再次似乎釋放圖像的2倍,所以我需要一個解決方案來檢查。

我很高興任何解決方案(只是現在它的工作),這更好。 即使將所有圖像完整地加載到數組中,但如前所述,它需要很多內存並在運行時需要很長時間加載時重新指定。 (1秒爲50圖像)

此外我需要RELASE並設置爲NIL,因爲否則它甚至會使我的內存使用超出限制。

回答

0

最簡單的方法是做這樣的事情:

if (someObject != nil) 
{ 
    [someObject release]; 
    someObject = nil; 
} 

不過,我不認爲你應該被釋放myimageview.image,假設myimageview是UIImageView。 UIImageView負責管理其圖像;你不應該搞亂它的保留計數。

也許你真正想做的事是這樣的:

myimageview.image = nil; 

這將導致myimageview停止定點釋放它現已無效的內存。

+0

沒有工作..現在解決它: if([myimageview.image retainCount]> 1)[myimageview.image release]; – 2010-08-15 21:21:02

+0

使用'retainCount'是個壞主意。它只能用於調試,而不能用於實際的程序邏輯,因爲它不一定代表保留對象的實際數量。你在做什麼可能看起來有效,但它不能保證工作。 – 2010-08-15 21:24:00

2

你永遠不會,永遠,釋放另一個對象的屬性。您釋放整個myimageview對象,或者只是分配給它的屬性。這些屬性如何進行內存管理是myimageview對象的私有業務。

+0

在這種情況下,我不得不!!也現在解決..thx – 2010-08-15 21:24:26

+0

是正確的。應該永遠不會出現爲其釋放其他對象的屬性的情況。我懷疑你真的「解決」了它;你剛剛繞過一個bug。 – 2010-08-15 21:28:15

-2

如果([myimageview.image retainCount]> 1)[myimageview.image釋放]解決了它;