2011-11-10 66 views
0

我有一個NSString稱爲動畫,這是所謂具有以下(工作)代碼:分配的NSString

animation=[rowInDataBase objectAtIndex:2] ; 
NSLog(@"animation:%@",animation); 

當我嘗試執行以下操作:

previousAnimation=animation; 

的previousAnimation分配ccsprite
當我嘗試登錄previousAnimationNSLog(@"previous-animation:%@",previousAnimation);檢查它的價值,應用程序崩潰,除非previousAnimationNULL

我在做什麼錯在我的任務?

+1

是在相同的方法或不同的方法這兩個語句?他們什麼時候執行? – jrturton

回答

1

你們是不是要複製字符串?如果是這樣,你應該做的:

NSString* previousAnimation = [NSString stringWithString:animation]; // autoreleased 

NSString* previousAnimation = [animation copy]; // retain count 1, need to release 

否則你應該保留

previousAnimation = [animation retain]; 

,並在完成後釋放previousAnimation。

+0

非常感謝,我做了[動畫複製]; ,它的工作,我也試圖stringWithString,但它崩潰。你能向我解釋爲什麼我需要拷貝嗎?和什麼是不同的財產? – Curnelious

+0

至於旁邊的代碼行的評論說,stringWithString給你一個自動釋放的對象,而副本給你保留的對象(r​​etainCount 1),你需要釋放你自己。它與stringWithString崩潰的原因可能是它在你不期待它被釋放的時候被釋放。 – jbat100

3

animation需要適當保留。您應該爲animationpreviousAnimation創建一個帶有retain屬性的屬性,並將它們設置爲這樣。

self.animation = [rowInDatabase objectAtIndex:2]; 
... 
self.previousAnimation = self.animation; 

現在這兩個值將在呼叫之間妥善保留,不再有崩潰問題。請記住在dealloc中釋放這兩個值。

+0

非常感謝。你能幫我簡單理解爲什麼我必須在那個案子中做財產嗎?我無法理解那件事。非常感謝 。 – Curnelious

1

這聽起來像你分配一個已經被釋放的變量,所以內存的其他一些隨機對象被重複使用(在你所提到的情況下,ccsprite對象也許)。但是,如果沒有在更多的上下文中看到代碼,很難說清楚。