NSString subStringToIndex цели C вызывает странную проблему - PullRequest
0 голосов
/ 21 октября 2010

Привет всем, я работаю над игрой, и у меня возникла очень странная проблема, и я надеялся получить помощь.По сути, иногда текст бывает немного длинным для отображения в одном текстовом поле, поэтому я хотел, чтобы он разбивал строку и сохранял невысказанный текст в строке, которая будет использоваться в следующем окне сообщения.Поэтому, когда я использую этот код ..

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

Это делает Talkin2 значением Hello, что я и хочу.Затем я сохраняю его в объекте с помощью ..

[_window setMultiMessage:Talkin2];

, который идет в мой набор и получает методы в объекте, который я создал.

В его интерфейсе ...

 NSString * multiMessage;

в его .m

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

, а затем главный объект снова вытаскивает его, когда завершает закрытие первого окна с ...

 NSString * talking = [_window getMultiMessage];

Now inотладка, я заметил, что значение разговора будет "вне области", когда я получу строку обратно из _window.И тогда он вылетает из моей программы, когда пытается его использовать.

Но.Если я делаю это, все работает нормально.

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

[_window setMultiMessage:Talkin1];

Так что он отлично работает (за исключением разделения строки, как я хочу), когда я использую @" ", но не когда я использую какой-либо результат substringToIndex или substringFromIndex.

Я новичокк цели c, поэтому я предполагаю, что это что-то основное, что я пропускаю.Любая помощь будет замечательной!Заранее спасибо.

1 Ответ

4 голосов
/ 21 октября 2010

(при условии отсутствия ГХ.)

-substringToIndex: возвращает объект с автоматическим освобождением.Но вы не сохраняете объект в установщике, поэтому никто не «владеет» Talkin2, и он будет освобожден «позже».Вам нужно скопировать или сохранить строку в установщике.

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

На самом деле вам действительно нужно использовать объявленную в Objective-C 2.0 функцию объявленное свойство .Это позволяет автоматически генерировать правильные сеттеры и геттеры.

@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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...