2010-10-13 62 views
0

我有一個字符串創建和比較似乎失去它的內容的問題。目前,我有這樣的:失去我的字符串

switch (creditPos) 
{ 
    case 0: 
     [creditCart.faceImage setImage:[NSString stringWithFormat:@"%@credits_face1.png", _director.platformPrefix]]; 
     break; 
    case 1: 
     [creditCart.faceImage setImage:[NSString stringWithFormat:@"%@credits_face2.png", _director.platformPrefix]]; 
     break; 
    case 2: 
     [creditCart.faceImage setImage:[NSString stringWithFormat:@"%@credits_face3.png", _director.platformPrefix]]; 
     break; 
    case 3: 
     [creditCart.faceImage setImage:[NSString stringWithFormat:@"%@credits_face4.png", _director.platformPrefix]]; 
     break; 
    case 4: 
     [creditCart.faceImage setImage:[NSString stringWithFormat:@"%@credits_face5.png", _director.platformPrefix]]; 
     break; 
    default: 
     break; 
} 

faceImage是我創建了一個對象和函數setImage我有...

- (void)setImage:(NSString *)inImageName { 

NSLog(@"Before Break"); 

// By default set the scale to 1.0f and the filtering to GL_NEAREST 
if(![imageName isEqualToString:inImageName]) 
{ 
    NSLog(@"Hit");} 

裏面我遇到的問題是,當我通過該字符串使用NSString stringWithFormat,它可能會工作5-8次,然後以某種方式調試併發送一些完全隨機的東西,而不是像-36.657這樣的函數。

這怎麼可能?參數中沒有任何內容正在改變,因爲_director.platformPrefix在程序的開始處設置並且從未改變過。唯一改變的是creditPos用字符串選擇來創建+傳遞給函數。以某種方式,創建的字符串在一些迭代之後只是亂碼,並試圖將它與傳入的最後一個字符串進行比較,導致代碼崩潰而不會返回任何錯誤。

幫助:(

+1

Psst。你也可以把它寫成一行代碼:'[creditCart.faceImage setImage:[NSString stringWithFormat:@「%@ credits_face%d.png」,_director.platformPrefix,(creditPos + 1)]];' – 2010-10-13 16:01:56

回答

-1

您可能想嘗試分配字符串,因爲這可能是autorelease問題。

NSString *myString = [[NSString alloc] initWithFormat:@"%@credits_face%d.png",_director.platformPrefix, creditPos+1]; 
[creditCart.faceImage setImage:myString]; 

然後讓setImage方法釋放字符串。

+0

這可能不會幫助,因爲_director。platformPrefix'的autorelease問題不是新創建的字符串。除此之外,參數化字符串,而不是醜陋的開關語句確實是更好的風格。 – 2010-10-13 16:03:34

+0

[NSString stringWithFormat:]也返回一個新的自動釋放字符串。 – Ben 2010-10-13 16:07:31

+0

感謝Ben,當我將它分配給imageName時,我在inImageName中添加了一個保留,現在它已修復它。編輯:實際上使用你的NSString分配線,而不需要保留。非常感謝。 – user355622 2010-10-13 16:16:12

0

聽起來像一個字符串時被之間dealloced英寸也許過度釋放或不能正確反應內存警告或viewDidUnload。

出於調試的目的,儘量保留_director.platformPrefix和打印出該對象的retainCount,如果問題消失,你確實有一個retainCount問題,在幾乎99%的情況下,最終的解決方案不是隻保留它,而是找到錯誤地釋放它的代碼

0

你如何分配inImageName到imageName如果你沒有使用屬性並且你不保留那麼你的inImageName字符串正在被垃圾收集。 stringWithFormat方法將返回一個自動釋放的字符串,除非保留它,否則將自動清除。

既可以在你的頭:

@property (nonatomic, retain) NSString *imageName; 

,並在您實現:

@synthesize imageName; 

或者添加[inImageName保留];在那裏你將它分配給imageName的地方。 (只要確保在分配它之前以及在dealloc方法中釋放imageName字符串即可。)

+0

我正在使用:@property(nonatomic,只讀)NSString * imageName;以防止任何imageName的設置。在檢查字符串是否相等的if語句下,我簡單地使用了imageName = inImageName。相反,我現在有imageName = [inImageName保留];這已經修復了它,謝謝關於stringWithFormat返回一個autoreleased字符串的heds。 – user355622 2010-10-13 16:14:11

0

我同意Ortwin;聽起來像platformPrefix沒有被正確保留,並且它在被覆蓋之前設法保持完整。