2011-03-03 178 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等。你知道,就像它會是一個選項。