назначить NSString

#objective-c

#objective-c

Вопрос:

У меня есть NSString под названием animation, которая вызывается с помощью следующего (рабочего) кода:

  animation=[rowInDataBase objectAtIndex:2] ;
 NSLog(@"animation:%@",animation);
  

Когда я пытаюсь выполнить следующее :

 previousAnimation=animation;
  

Предыдущая анимация назначена ccsprite .
Когда я пытаюсь войти в систему previousAnimation , чтобы проверить ее значение с помощью NSLog(@"previous-animation:%@",previousAnimation); , приложение завершает работу, если previousAnimation не NULL

Что я делаю не так в своем назначении?

Комментарии:

1. Являются ли эти два оператора одним и тем же методом или разными методами? Когда они оба выполняются?

Ответ №1:

animation необходимо правильно сохранить. Вы должны создать свойство с атрибутом сохранения для animation и previousAnimation и установить их следующим образом.

 self.animation = [rowInDatabase objectAtIndex:2];
...
self.previousAnimation = self.animation;
  

Теперь оба значения будут правильно сохраняться между вызовами, у вас больше не будет проблем со сбоями. Просто не забудьте освободить оба значения в dealloc .

Комментарии:

1. большое спасибо. можете ли вы помочь мне вкратце понять, почему я должен использовать свойство в этом случае nsstring? я просто не мог понять эту вещь. большое спасибо .

Ответ №2:

Вы пытаетесь скопировать строку? Если это так, вы должны делать:

 NSString* previousAnimation = [NSString stringWithString:animation]; // autoreleased
  

или

 NSString* previousAnimation = [animation copy]; // retain count 1, need to release
  

в противном случае вы должны сохранить

 previousAnimation = [animation retain];
  

и отпустите предыдущую анимацию, когда закончите.

Комментарии:

1. большое спасибо, я сделал [анимационную копию]; , это сработало, я также пробовал stringWithString , но он вылетает. можете ли вы объяснить мне, зачем мне нужно выполнять копирование? и чем это отличается от свойства?

2. Как говорится в комментариях рядом со строками кода, stringWithString предоставляет вам автоматически освобожденный объект, в то время как copy предоставляет вам сохраненный объект (с сохраненным числом 1), который вам нужно освободить самостоятельно. Причина сбоя с stringWithString, вероятно, заключается в том, что он выпускается, когда вы этого не ожидаете.

Ответ №3:

Похоже, вы назначаете переменную, которая уже была освобождена, поэтому память повторно используется каким-то другим случайным объектом (в упомянутом вами случае, возможно, объектом ccsprite). Но трудно сказать наверняка, не увидев код в более широком контексте.