在数组中存储自定义alloc'ed对象。内存管理

时间:2011-05-02 22:28:09

标签: objective-c memory-management

我不确定我是否正确编写此代码。

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 CLASS中设置的变量。

1 个答案:

答案 0 :(得分:6)

在将对象添加到数组后立即释放对象 - 标准的objective-c容器会保留其元素,然后在释放容器时释放它们,因此您无需担心自己的内存管理。

因此,当您创建并填充数组时,释放您的元素:

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

在你的viewDidUnload方法中(以及在dealloc中)只释放你的数组,而不是它的元素:

[fruitArray release];

如果将[o1 release];放入代码中,则会出现错误的原因是,在这种情况下,您将对象释放两次,并且只保留一次 - 分配时。