2010-10-21 42 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