将自定义分配的对象存储在数组中。内存管理

Posted

技术标签:

【中文标题】将自定义分配的对象存储在数组中。内存管理【英文标题】:Storing custom alloc'ed objects in an array. Memory Management 【发布时间】:2011-05-02 22:28:08 【问题描述】:

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

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

【问题讨论】:

for() 循环从您的viewDidUnload 方法中取出。这样管理你的记忆是绝对错误的。 粘贴-[Fruit initWithName:imageView:]的代码。 它看起来在我的代码中的其他地方; (感谢弗拉基米尔,正确答案如下。 【参考方案1】:

在将对象添加到数组后立即释放对象 - 标准的 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 是的,但这表明他在代码的其他地方有错误。弗拉基米尔的回答是正确的。 嗨弗拉基米尔。我也认为那是正确的,我仍然认为那是正确的。但是,当我将 Fruit 对象添加到数组中后释放它时,水果对象似乎没有被保留,所以当我稍后访问它时,它会导致“exc_bad_access”。这就是为什么我有点困惑并添加了独特的发布循环。 您的实际代码与您发布的代码不同吗?可能是如果用多种水果做一些不同的事情......这种方法应该可以正常工作 你是对的。问题出在我的水果类中,当我在添加到数组后释放时。我无法访问fruit.colour,我将此值保存在我的 Fruit.m 文件中,其中 color = [[UIColour redColor] retain];但现在我不能在代码中访问fruitObject.colour?我不太明白为什么我的颜色对象没有保留?

以上是关于将自定义分配的对象存储在数组中。内存管理的主要内容,如果未能解决你的问题,请参考以下文章

一维数组和面向对象基础知识

C++中内存分配问题

如何将自定义数组保存/重新加载到 plist

将自定义对象存储到 Android 内部存储的最佳方式?

Java基础-数组内存分配

java内存分配(堆栈常量池)