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,下面的正确答案。)。