内存泄漏与阵列

时间:2011-03-03 21:26:41

标签: iphone objective-c ios4

有人能指出我正确的方向吗?当我把这个文件作为一个笔尖加载,并卸载它,并重新加载它时,仪器说我得到了内存泄漏。具体来说,它说我在哪里设置了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];}

1 个答案:

答案 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等。你知道,就像它是一个选项。