Хранение пользовательских распределенных объектов в массиве.Управление памятью - PullRequest
1 голос
/ 03 мая 2011

Я не уверен, правильно ли я пишу этот код.

Fruit * o1 = [[Fruit alloc] initWithName:kFruitOrange imageView:orange1] ;
fruitArray = [[NSMutableArray arrayWithObjects:o1, nil] retain]; // retain array for later use.

На самом деле есть несколько фруктов.Так как я размещаю их, то присваиваю их массиву в моем методе init класса.Когда и как я должен выпустить эти объекты.

РАЗЪЯСНЕНИЕ. Если после сохранения в массиве я освобождаю [o1 release], я получаю ошибки "exc_bad_access" при просмотре массива другими методами.

В моем методе viewDidUnloadЯ просмотрел массив и освободил каждый объект вручную.

  for (Fruit * f  in fruitArray) {
        [f release];
    }

Я никогда раньше не видел, чтобы кто-то делал это в коде, поэтому я думаю, что это неправильный способ сделать это?

ОБНОВЛЕНИЕ

-(Fruit *) initWithName:(enum fruitTypes)fruitName imageView:(UIImageView *)iv{
    if((self = [super init])){
        name = @"Fuit Object";
        NSLog(@"creating orange colour %i", fruitName);
        switch (fruitName) {
            case kFruitOrange:
                 NSLog(@"creating orange colour ");
                colour = [UIColor orangeColor] ;
                break;
            case kFruitBanana:
                colour = [UIColor yellowColor];
                break;
            case kFruitKiwi:
                colour = [UIColor greenColor];
                break;
            case kFruitBlue:
                colour = [UIColor blueColor];
                break;
            default:
                NSLog(@"COLOUR NOT FOUND");
                break;
        }
        value = fruitName;
        imageView = iv;
        center = iv.center;


        [colour retain];
        [imageView retain];
        [name retain];


        return self;
    }
    return nil;

}

** ОТВЕТ Я ДОЛЖЕН СОХРАНИТЬ ПЕРЕМЕННЫЕ, КОТОРЫЕ Я УСТАНОВИЛ В МОЕМ КЛАССЕ FRUIT.M.

1 Ответ

6 голосов
/ 03 мая 2011

Освобождение объектов сразу после добавления их в массив - стандартные контейнеры target-c сохраняют свои элементы и затем освобождают их, когда сам контейнер освобождается, поэтому вам не нужно беспокоиться об управлении памятью самостоятельно.

Итак, когда вы создаете и заполняете массив, освобождаете ваши элементы:

Fruit * o1 = [[Fruit alloc] initWithName:kFruitOrange imageView:orange1] ;
fruitArray = [[NSMutableArray arrayWithObjects:o1, nil] retain];
[o1 release];

А в вашем методе viewDidUnload (и в dealloc) просто освободите ваш массив, а не его элементы:

[fruitArray release];

Причина, по которой вы получаете ошибки, если вы добавляете [o1 release]; в свой код, заключается в том, что в этом случае вы освобождаете свой объект дважды, и он сохраняется только один раз - при выделении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...