Изменения типа объекта - PullRequest
       24

Изменения типа объекта

1 голос
/ 20 апреля 2011

У меня возникла небольшая проблема с удержанием смеси пользовательских классов и представлений UIImage в массиве.Они хранятся в массиве, и я использую:

 if ([[fixtures objectAtIndex:index] isKindOfClass:[Fixture class]]) 

, чтобы различать, является ли это объектом UIIMage или Fixture.Мой исходный код для этого:

    - (void) moveActionGestureRecognizerStateChanged: (UIGestureRecognizer *) recognizer
    {
     switch ( recognizer.state )
        {
       case UIGestureRecognizerStateBegan:
            {
                NSUInteger index = [fixtureGrid indexForItemAtPoint: [recognizer locationInView: fixtureGrid]];
                emptyCellIndex = index;    // we'll put an empty cell here now

                // find the cell at the current point and copy it into our main view, applying some transforms
                AQGridViewCell * sourceCell = [fixtureGrid cellForItemAtIndex: index];
                CGRect frame = [self.view convertRect: sourceCell.frame fromView: fixtureGrid];
                dragCell = [[FixtureCell alloc] initWithFrame: frame reuseIdentifier: @""];

                if ([[fixtures objectAtIndex:index] isKindOfClass:[Fixture class]]) {
                    Fixture *newFixture = [[Fixture alloc] init];
                    newFixture = [fixtures objectAtIndex:index];
                    dragCell.icon = [UIImage imageNamed:newFixture.fixtureStringPath];
                    [newFixture release];  
                } else {
                    dragCell.icon = [fixtures objectAtIndex: index];
                }
                [self.view addSubview: dragCell];
    }
}

Однако при перетаскивании ячейки, которая была объектом класса Fixture, я получал бы ошибки, такие как EXC_BAD_ACCESS или нераспознанный селектор, отправленный на экземпляр (который имеет смысл, как это былоотправив CALayerArray команду масштабирования.

Поэтому я установил точку останова для просмотра внутри массива fixtures. Здесь я увидел, что все UIImages были установлены на правильный тип класса, но также было:

  • (CALayerArray *)
  • (Fixture *)
  • (NSObject *)

для позиций, в которых классы Fixture удерживались в массиве.Может ли кто-нибудь пролить свет на то, почему он это делает? Если вам нужна дополнительная информация, пожалуйста, не стесняйтесь спрашивать.

Денис

1 Ответ

4 голосов
/ 20 апреля 2011

В вашем коде здесь:

Fixture *newFixture = [[Fixture alloc] init];
newFixture = [fixtures objectAtIndex:index];
dragCell.icon = [UIImage imageNamed:newFixture.fixtureStringPath];
[newFixture release];

Похоже, вы выпускаете объект авто-релиза (newFixture). Когда вы получаете объект из массива, это автоматическое освобождение. У вас также есть утечка памяти, когда вы размещаете newFixture в первой строке, этот объект никогда не освобождается, потому что вы заменяете указатель на него во второй строке.

Fixture *newFixture = [[Fixture alloc] init];  // THIS OBJECT IS NEVER RELEASED
newFixture = [fixtures objectAtIndex:index]; // YOU'RE REPLACING THE newFixture POINTER WITH AN OBJECT FROM THE ARRAY
dragCell.icon = [UIImage imageNamed:newFixture.fixtureStringPath];
[newFixture release]; // YOU'RE RELEASING AN AUTORELEASED OBJECT

Таким образом, код должен быть похож на

Fixture *newFixture = [fixtures objectAtIndex:index];
dragCell.icon = [UIImage imageNamed:newFixture.fixtureStringPath];

Тогда ваша собственность должна правильно сохранить изображение.

...