2010-10-21 35 views
0

大家好我正在開發一款遊戲,並且遇到了一個非常奇怪的問題,希望得到一些幫助。基本上有時文本在一個文本框中顯示的時間有點長,所以我想讓它分解一個字符串並將未顯示的文本存儲在一個字符串中,以便在下一個消息框中使用。所以當我使用此代碼..Objective C的NSString subStringToIndex導致奇怪的問題

NSString * Talkin1 = @"Hello I am an annoying string"; 
NSString * Talkin2 = [Talkin1 substringToIndex:5]; 

它使Talkin2的值,這是我想要的。然後我把它存儲在對象中..

[_window setMultiMessage:Talkin2]; 

它去我的設置和獲得我的對象方法。

在它的界面...

NSString * multiMessage; 

在其.M

-(void) setMultiMessage:(NSString*)messageTwo 
{ 
multiMessage = messageTwo; 
} 
-(NSString*) getMultiMessage 
{ 
return multiMessage; 
} 

再到後來的主要對象又拉出來,當它完成與關閉第一個窗口...

NSString * talking = [_window getMultiMessage]; 

現在在調試中,我注意到當我得到字符串bac時,說話的值將會「超出範圍」來自_window的k。那麼當它嘗試使用它時,它會崩潰我的程序。

但是。如果我這樣做一切正常。

NSString * Talkin1 = @"Hello I am an annoying string"; 
//NSString * Talkin2 = [Talkin1 substringToIndex:5]; 

[_window setMultiMessage:Talkin1]; 

因此,工程完美(除分割字符串像我想)當我使用@" "但不是當我使用substringToIndex或substringFromIndex的任何結果。

我是新來的目標c,所以我認爲這是基本我失蹤的東西。任何幫助將是美好的!先謝謝你。

回答

4

(假設沒有GC。)

-substringToIndex:返回一個自動釋放的對象。但是你並沒有將對象保留在setter中,因此沒有人「擁有」Talkin2,它將在「稍後」釋放。您需要在設置器中複製或保留字符串。

-(void) setMultiMessage:(NSString*)messageTwo { 
    if (multiMessage != messageTwo) { 
    [multiMessage release]; 
    multiMessage = [messageTwo retain]; 
    } 
} 

其實應該要使用的Objective-C 2.0的declared property功能。它允許自動生成正確的setter和getter。

@interface .... { ... } 
... 
@property(copy) NSString* multiMessage; // <-- 
... 
@end 

@implementation .... 
@synthesize multiMessage;  // <-- 
... 
@end 

... 

_window.multiMessage = Talkin2; 
// or: [_window setMultiMessage:Talkin2]; 

NSString* talking = _window.multiMessage; 
// or: talking = [_window multiMessage]; 
+0

嗨,謝謝,解決了這個問題,雖然我不得不把if語句變成multiMessage!= messageTwo這就是我認爲你的意思。非常感謝你,我被困在那裏好幾天了。 – Bagellad 2010-10-21 16:14:08

+0

@Bagellad:沒錯,'multiMessage!= messageTwo'。這就是爲什麼我們應該使用聲明的屬性:)。 – kennytm 2010-10-21 16:16:37

+0

我會開始使用他們相信我。 – Bagellad 2010-10-21 16:18:08