Objective c 存储自定义alloc';数组中的已删除对象。内存管理

Objective c 存储自定义alloc';数组中的已删除对象。内存管理,objective-c,memory-management,Objective C,Memory Management,我不确定我是否正确地编写了这段代码 Fruit * o1 = [[Fruit alloc] initWithName:kFruitOrange imageView:orange1] ; fruitArray = [[NSMutableArray arrayWithObjects:o1, nil] retain]; // retain array for later use. 实际上有几种水果。由于我分配了它们,然后将它们分配给类init方法中的数组。何时以及如何释放这些对象 澄清。 如果我释放

我不确定我是否正确地编写了这段代码

Fruit * o1 = [[Fruit alloc] initWithName:kFruitOrange imageView:orange1] ;
fruitArray = [[NSMutableArray arrayWithObjects:o1, nil] retain]; // retain array for later use.
实际上有几种水果。由于我分配了它们,然后将它们分配给类init方法中的数组。何时以及如何释放这些对象

澄清。 如果我释放
[o1 release]
保存到数组中后,在用其他方法查看数组时,会出现“exc\u bad\u 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类中设置的变量

在将对象添加到数组后立即释放它们-标准objective-c容器保留它们的元素,然后在容器本身被释放时释放它们,所以您自己不需要担心内存管理

因此,在创建和填充阵列时,请释放元素:

Fruit * o1 = [[Fruit alloc] initWithName:kFruitOrange imageView:orange1] ;
fruitArray = [[NSMutableArray arrayWithObjects:o1, nil] retain];
[o1 release];
在viewDidUnload方法(以及dealloc)中,只需释放数组,而不是其元素:

[fruitArray release];

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

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

因此,在创建和填充阵列时,请释放元素:

Fruit * o1 = [[Fruit alloc] initWithName:kFruitOrange imageView:orange1] ;
fruitArray = [[NSMutableArray arrayWithObjects:o1, nil] retain];
[o1 release];
在viewDidUnload方法(以及dealloc)中,只需释放数组,而不是其元素:

[fruitArray release];

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

我认为海报上说,如果他在之后立即释放对象,他以后会在代码中出错。@Kal是的,但这表明他在代码的其他地方有错误。弗拉基米尔的回答是正确的。嗨,弗拉基米尔。我认为这也是正确的,我仍然认为这是正确的。但当我在将水果对象添加到数组中后释放水果对象时,水果对象似乎不会被保留,因此当我稍后访问它时,它会导致“exc_bad_access”。这就是为什么我有点困惑,并添加了独特的发布循环。你的实际代码与你发布的不同吗?可能是如果用多种水果做一些不同的事情。。。如果你是正确的,这种方法应该很有效。问题是在我的水果类中,当我添加到数组后发布时。我无法访问fruit.color,我用color=[[uicolor redColor]retain]将此值保存在我的fruit.m文件中;但现在我无法访问稍后代码中的水果对象.color?我不太明白为什么我的颜色对象没有被保留?我想海报上说,如果他在之后立即发布它,他以后会在代码中出错。@Kal是的,但这表明他在代码的其他地方有错误。弗拉基米尔的回答是正确的。嗨,弗拉基米尔。我认为这也是正确的,我仍然认为这是正确的。但当我在将水果对象添加到数组中后释放水果对象时,水果对象似乎不会被保留,因此当我稍后访问它时,它会导致“exc_bad_access”。这就是为什么我有点困惑,并添加了独特的发布循环。你的实际代码与你发布的不同吗?可能是如果用多种水果做一些不同的事情。。。如果你是正确的,这种方法应该很有效。问题是在我的水果类中,当我添加到数组后发布时。我无法访问fruit.color,我用color=[[uicolor redColor]retain]将此值保存在我的fruit.m文件中;但现在我无法访问稍后代码中的水果对象.color?我不太明白为什么我的颜色对象没有被保留?把
for()
循环从
viewDidUnload
方法中去掉。这样管理内存是绝对错误的。请将
-[Fruit initWithName:imageView:
的代码粘贴到我的代码中;(感谢VLADIMIR,下面的正确答案。将
for()
循环从
viewDidUnload
方法中取出。这样管理内存是绝对错误的。将
-[Fruit initWithName:imageView::
的代码粘贴到我的代码中。它看起来在我的代码中的其他地方;(感谢VLADIMIR,下面的正确答案。)。