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

Joh*_*ger 1 memory-management objective-c

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

Fruit * o1 = [[Fruit alloc] initWithName:kFruitOrange imageView:orange1] ;
fruitArray = [[NSMutableArray arrayWithObjects:o1, nil] retain]; // retain array for later use.
Run Code Online (Sandbox Code Playgroud)

实际上有几种水果.因为我分配它们,然后在我的类init方法中将它们分配给一个数组.何时以及如何释放这些对象.

澄清. 如果我[o1 release]在保存数组后释放 ,在其他方法中查看数组时会出现"exc_bad_access"错误.

在我的viewDidUnload方法中,我已经完成了数组并手动释放了每个对象.

  for (Fruit * f  in fruitArray) {
        [f release];
    }
Run Code Online (Sandbox Code Playgroud)

我之前从未见过其他人在代码中这样做过,所以我认为这不是正确的方法吗?

UPDATE

-(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;

}
Run Code Online (Sandbox Code Playgroud)

**答案我需要保留我在FRUIT.M CLASS中设置的变量.

Vla*_*mir 6

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

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

Fruit * o1 = [[Fruit alloc] initWithName:kFruitOrange imageView:orange1] ;
fruitArray = [[NSMutableArray arrayWithObjects:o1, nil] retain];
[o1 release];
Run Code Online (Sandbox Code Playgroud)

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

[fruitArray release];
Run Code Online (Sandbox Code Playgroud)

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