#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). Но трудно сказать наверняка, не увидев код в более широком контексте.