Извлечение объекта класса из NSArray и добавление в self

#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];
        }

    }