2011-03-03 224 views
0

有人可以指出我在正确的方向。当我将这个文件作为一个笔尖加载,并卸载它,并重新加载它的仪器说我得到一个内存泄漏。具体来说,它说我在哪里设置了compareOptions NSMutableArray,以及我在哪里调用[vc release]。 CompareOptions是一个合成属性,它也在dealloc中发布。 非常感谢提前。内存泄漏与阵列

- (void)viewDidLoad{ 
[super viewDidLoad]; 

//NSLog(@"Comparison.viewDidLoad"); 

self.compareOptions = [[NSMutableArray alloc] init]; 


self.tabs = [[ComparisonTabs alloc] initWithFrame:CGRectMake(450, 85, 650, 50)]; 

    //NSDictionary * currComparison = (NSDictionary*)[data objectAtIndex:0]; 
    //NSArray   * correctOptions = [currComparison objectForKey:@"correct"]; 

for(int i = 0; i < 3; i++) 
{ 
    UIViewController * vc = [[UIViewController alloc] initWithNibName:@"ComparisonOptions" bundle:nil]; 

    ComparisonOptions * options = (ComparisonOptions *)vc.view; 

    [options setup]; 
    options.index = i; 

    //options.frame = CGRectMake(355 + (306 * i), 475, options.frame.size.width, options.frame.size.height); 

    //[options setCorrect:[correctOptions objectAtIndex:i]]; 

    [vc release]; 

    [self.view addSubview:options]; 

    [self.compareOptions addObject:options]; 
} 

[self.view addSubview:self.tabs]; 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tabSelectedHandler:) name:@"tabSelected" object:nil ]; 

[self update:0];} 

回答

3

compareOptions和tabs的属性是怎样的?它保留你的物体吗?

如果确实保留,那么如果使用setter和alloc,则会得到双重保留。

self.compareOptions = [[NSMutableArray alloc] init]; 
    ^retains       ^^^^^ retains 

self.tabs = [[ComparisonTabs alloc] initWithFrame:CGRectMake(450, 85, 650, 50)]; 
    ^retains    ^^^^^ retains 

你可以使用这个代替

self.compareOptions = [NSMutableArray array]; 
self.tabs = [[[ComparisonTabs alloc] initWithFrame:CGRectMake(450, 85, 650, 50)] autorelease]; 

UIViewController * vc = [[UIViewController alloc] initWithNibName:@"ComparisonOptions" bundle:nil]; 
ComparisonOptions * options = (ComparisonOptions *)vc.view; 

[vc release]; 

[self.view addSubview:options]; 

vc.view(即期权)将在同一时间的VC被释放将会被释放。当你调用[vc release]时会发生这种情况。此后您不能使用选项。

将视图添加到子视图后,您应该释放vc。


你应该考虑更好的类名。我永远不会认为ComparisonOptions是一个视图。这听起来更像NSCaseInsensitiveSearch等。你知道,就像它会是一个选项。