我不确定我是否正确编写此代码。
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 CLASS中设置的变量。
答案 0 :(得分:6)
在将对象添加到数组后立即释放对象 - 标准的objective-c容器会保留其元素,然后在释放容器时释放它们,因此您无需担心自己的内存管理。
因此,当您创建并填充数组时,释放您的元素:
Fruit * o1 = [[Fruit alloc] initWithName:kFruitOrange imageView:orange1] ;
fruitArray = [[NSMutableArray arrayWithObjects:o1, nil] retain];
[o1 release];
在你的viewDidUnload方法中(以及在dealloc中)只释放你的数组,而不是它的元素:
[fruitArray release];
如果将[o1 release];
放入代码中,则会出现错误的原因是,在这种情况下,您将对象释放两次,并且只保留一次 - 分配时。