#objective-c #cocos2d-iphone #nsmutablearray #nsarray
#objective-c #cocos2d-iphone #nsmutablearray #nsarray
Вопрос:
Привет, я пытаюсь извлечь объект определенного класса из NSMutableArray, а затем добавить его в self: например:
- (void) init{
_Objects = [[NSMutableArray alloc]init];
Psychicing *psy = [[Psychicing alloc]init];
[psy startPsychic];
[_Objects addObject: psy];
[psy release];
}
Это создает объект класса Psychicing, затем запускает метод [psy startPsychic] для создания внутренних компонентов объекта класса. Затем я добавляю объект psy в _Objects NSMutableArray.
-(void)startPsychic{
id psychicParticle = [CCParticleSystemQuad ......]; //is Synthesised with (assign)
//Other things are set here such as position, gravity, speed etc...
}
При обнаружении касания на экране я хочу взять объект psy из массива _Objects и добавить его в self: Что-то вроде этого (хотя это приводит к ошибке во время выполнения)
-(void) Touches.....{
for (Psychicing *psy in _Objects){
[self addChild: psy.psychicParticle];
}
}
Я надеюсь, что я объяснил это достаточно ясно, если вам нужно больше разъяснений, дайте мне знать.
Итак, в основном:
[Инициализация основного класса] -> [Запуск Psychicing startPsychic] -> [Добавление основного класса в массив] -> [Добавление основного класса в self]
Комментарии:
1. Пожалуйста, опубликуйте точную ошибку, которую вы получаете.
2. завершающий вызов после того, как экземпляр программы ‘NSException’ получил сигнал SIGABRT
3. Приведенный выше код не будет компилироваться, потому что
_Objects
переменная, на которую ссылается вашTouches....
метод, не объявлена (она объявлена только локально вinit
). Я предполагаю, что_Objects
это переменная экземпляра в вашем реальном коде — можете ли вы дать нам реальный отрывок?4. Извините, это моя ошибка, это глобальная переменная, а не переменная метода, я обновлю свой код.
Ответ №1:
Я предполагаю, что _Objects (который должен быть в нижнем регистре o, чтобы следовать соглашениям) хранит объекты, отличные от объекта Psychicing, и вы пытаетесь извлечь из него только объект Psychicing с помощью -(void) касаний… метод (который также должен быть в нижнем регистре). Если это так, вы могли бы сделать:
for (id obj in _Objects)
{
if ([obj isMemberOfClass:[Psychicing class]])
[self addChild:obj.psychicParticle];
}
Это приведет к тому, что в self в качестве дочерних будут добавлены только объекты Psychicing в массиве.
Похоже, у вас действительно есть другая ошибка, хотя, если код, который вы вставили, является вашим реальным кодом. Инициализация должна быть определена как:
- (void) init{
_Objects = [[NSMutableArray alloc]init];
Psychicing *psy = [[Psychicing alloc]init];
[psy startPsychic];
[_Objects addObject: psy];
[psy release];
}
с _Objects, определенным как переменная экземпляра (или свойство) в интерфейсе класса. Как вы написали, это переменная метода в методе init, и она протекает. Поэтому, когда вы пытаетесь получить доступ к _Objects in -touch, _Objects, скорее всего, равен нулю.
Комментарии:
1. Эй, извините, _Objects — это глобальная переменная, а не переменная метода. Используя ваш код, у меня теперь возникли проблемы с этой строкой: [self addChild:obj.psychicParticle]; кажется, что у obj нет никаких свойств с именем psychicParticle, поэтому это выдает мне синтаксическую ошибку..
2. Есть ли у Psychicing свойство psychicParticle? Я сделал это только потому, что это то, что вы сохраняли с помощью addChild: в вопросе. Если вы пытаетесь сохранить объект Psychicing, просто выполните [self addChild:obj];
Ответ №2:
Хорошо, с помощью McCygnus я заставил его работать, не хватает только указателя на объект id:
for (id obj in _Objects){
if ([obj isMemberOfClass:[Psychicing class]]){
Psychicing *apsy = obj;
[apsy.psychicParticle setPosition:location];
[self addChild:apsy.psychicParticle];
}
}