iPhone Objective C: Метод для генерации нового объекта и его возврата, похоже, генерирует старый объект

#iphone #objective-c

#iPhone #objective-c

Вопрос:

Я пишу игру, и мне нужно создать «Препятствия», я создал метод, который случайным образом генерирует препятствия и возвращает их. Сначала в методе я сделал что-то вроде этого,

 Obstacle newObstacle = [[Obstacle alloc] init];
[newObstacle setFrame:CGRectMake(randX, randY, 50, 50)];
return newObstacle;
  

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

Итак, затем я изменил код на:

 return [[Obstacle alloc] initWithFrame:CGRectMake(randX, randY, 50, 50)];
  

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

Есть какие-либо подсказки относительно того, что здесь происходит? Дайте мне знать, если мне нужно предоставить больше кода.

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

1. Покажите код, в котором вы помещаете их в массив.

2. было бы полезно, если бы вы могли показать нам свой код цикла, который генерирует их все

3. Надеюсь, ваш класс препятствий не является одноэлементным классом. Если вы написали этот класс, подтвердите это, и если это библиотека с открытым исходным кодом, просмотрите код один раз, пожалуйста.

Ответ №1:

Возможно, вам нужно написать:

 Obstacle *newObstacle = [[Obstacle alloc] init];
  

с помощью *

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

1. Если бы это была реальная ошибка в коде, а не просто опечатка в вопросе, что бы произошло?

2. да, это была просто опечатка в вопросе, у меня была звездочка в программе….. Я выясняю, что на самом деле это не та проблема, о которой я думал, объекты возвращаются с разными адресами в памяти, у них просто одинаковый набор фреймов, хотя x и y должны быть случайными… Мне нужно будет выяснить, почему это происходит… и я немного обновлю

3. Итак, я выяснил, почему это происходило. Функция time возвращала целое число, которое было слишком большим для функции random seed, поэтому, когда было лишь небольшое изменение во времени, это фактически не изменило бы начальное значение. Короче говоря, функция time перегрузила начальное значение. Итак, чтобы решить эту проблему, все, что мне нужно было сделать, это уменьшить значение примерно на это

Ответ №2:

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