Joh*_*ger 1 memory-management objective-c
我不确定我是否正确编写此代码.
Fruit * o1 = [[Fruit alloc] initWithName:kFruitOrange imageView:orange1] ;
fruitArray = [[NSMutableArray arrayWithObjects:o1, nil] retain]; // retain array for later use.
Run Code Online (Sandbox Code Playgroud)
实际上有几种水果.因为我分配它们,然后在我的类init方法中将它们分配给一个数组.何时以及如何释放这些对象.
澄清.
如果我[o1 release]在保存数组后释放
,在其他方法中查看数组时会出现"exc_bad_access"错误.
在我的viewDidUnload方法中,我已经完成了数组并手动释放了每个对象.
for (Fruit * f in fruitArray) {
[f release];
}
Run Code Online (Sandbox Code Playgroud)
我之前从未见过其他人在代码中这样做过,所以我认为这不是正确的方法吗?
UPDATE
-(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;
}
Run Code Online (Sandbox Code Playgroud)
**答案我需要保留我在FRUIT.M CLASS中设置的变量.
在将对象添加到数组后立即释放对象 - 标准objective-c容器保留其元素,然后在释放容器时释放它们,因此您不必担心自己的内存管理.
因此,当您创建并填充数组时,释放您的元素:
Fruit * o1 = [[Fruit alloc] initWithName:kFruitOrange imageView:orange1] ;
fruitArray = [[NSMutableArray arrayWithObjects:o1, nil] retain];
[o1 release];
Run Code Online (Sandbox Code Playgroud)
在你的viewDidUnload方法中(以及在dealloc中)只释放你的数组,而不是它的元素:
[fruitArray release];
Run Code Online (Sandbox Code Playgroud)
如果你[o1 release];输入你的代码就会出现错误的原因是,在这种情况下你会释放你的对象两次并且只保留一次 - 分配时.