将自定义分配的对象存储在数组中。内存管理
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?我不太明白为什么我的颜色对象没有保留?以上是关于将自定义分配的对象存储在数组中。内存管理的主要内容,如果未能解决你的问题,请参考以下文章