Objective C的NSString subStringToIndex导致奇怪的问题

时间:2010-10-21 06:46:15

标签: objective-c nsstring

大家好我正在玩游戏,我遇到了一个非常奇怪的问题,希望得到一些帮助。基本上有时文本在一个文本框中显示有点长,所以我希望它分解一个字符串并将未显示的文本存储在一个字符串中,以便在下一个消息框中使用。所以当我使用这段代码时..

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

它使Talkin2成为Hello的值,这就是我想要的。然后我将它存储在具有..

的对象中
[_window setMultiMessage:Talkin2];

进入我的set并在我创建的对象中获取方法。

在它的界面......

 NSString * multiMessage;

在.m

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

然后主要对象再次拉出它,当它用...完成关闭第一个窗口时

 NSString * talking = [_window getMultiMessage];

现在在调试中,我注意到当我从_window返回字符串时,说话的值将“超出范围”。因此,当它尝试使用它时,它会崩溃我的程序。

但是。如果我这样做一切正常。

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

[_window setMultiMessage:Talkin1];

因此,当我使用@" "时,它工作完美(除了我想要分割字符串),但是当我使用substringToIndex或substringFromIndex的任何结果时,它不是。

我是目标c的新手所以我认为这是我缺少的基本内容。任何帮助都会很精彩!提前谢谢。

1 个答案:

答案 0 :(得分:4)

(假设没有GC。)

-substringToIndex:返回一个自动释放的对象。但是你没有在setter中保留这个对象,因此没有人“拥有”Talkin2,它将在“后来”被解除分配。您需要在setter中复制或保留字符串。

-(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];