2012-05-31 3 views
0

Эта проблема меня смущает уже несколько дней. У меня есть NSString, 'spriteType'. Он объявляется с использованием свойства и метода синтеза. В моем слое, где создается строка, я также создаю CCNode. Узел создается в методе.Переоценка объекта при нажатии кнопки

- (void) spritePick { 

CCMenuItemImage *go = [CCMenuItemImage itemFromNormalImage:@"button_go.png" selectedImage:@"button_go_selected.png" target:self selector:@selector(test)]; 
spritePickMenu = [CCMenu menuWithItems:go, nil]; 
spritePickMenu.position = ccp(0,0); 

spritePick = [CCNode node]; 
[spritePick addChild:spritePickMenu]; 
spritePick.position = ccp(240,160); 
[self addChild: spritePick]; 
} 

Метод 'тест', который вызывается с помощью кнопки, просто:

- (void) test { 
NSLog(@"%@",spriteType); 
} 

Линия NSLog разбивает мою игру, и выдает ошибку: EXC_BAD_ACCESS

Везде, кроме внутри метода «test» код работает нормально. Почему это должно было дать мне ошибку, когда метод был вызван из узла, но он не дал бы его мне, когда он был вызван из другого места?

При необходимости я могу указать полный код.

+0

проверить поток кода еще раз, иногда мы можем пропустить что-то. По моим предположениям, «spriteType» не инициализирован. Некоторые, где в вашем коде записывают следующую строку, а затем проверяют self.spriteType = @ ""; – ajay

+0

Возможно, вы делаете что-то неправильно с памятью, создавая зомби, который заканчивает сбой приложения. Предоставление полного кода выглядит как хорошая идея. – Lio

ответ

1

Какие атрибуты вы используете для своей декларации о собственности spriteType?

Если ваш проект использует ARC, заголовок должен выглядеть следующим образом:

@property (nonatomic, strong) NSString *spriteType; 

Хотя реализация должна выглядеть следующим образом:

@synthesize spriteType = spriteType_; 

Если вы объявляете/синтезировать ваше имущество таким образом, то NSLog(@"%@", self.spriteType) просто записывает (null) в консоль (я тестировал для проверки).

Это хорошая практика для доступа к вашим ресурсам с использованием self., а не для прямого доступа к базовому ivar.

Поскольку вы видите EXC_BAD_ACCESS я предполагаю, что вы не поддерживаете сильную ссылку на self.spriteType.

Если ваш проект использует ARC, вы должны быть уверены, что вы собираете с LLVM 3.0 или выше, как подробно in this answer.

+0

Когда я использую это, я получаю сообщение об ошибке @property: «Ожидаемый атрибут свойства до« strong » – akuritsu

+0

Является ли ваш проект использующим ARC и компиляцией с GCC? Вам нужно скомпилировать LLVM/Clang. Обновил мой ответ соответственно. –

+0

На данный момент я не использую ARC, поскольку я использую шаблон cocos2d, и поэтому он не включался автоматически. Я могу включить его, но стоит ли это? – akuritsu

Смежные вопросы