以编程方式创建ViewController并可能发生内存泄漏

时间:2013-01-28 09:17:44

标签: ios memory-management

我有时难以理解iOS的内存管理。

我接管了一些应用,我正在开发它。应用程序是在部署目标4.3下开发的,并且由于客户的要求而无法更改。

有一种创建Picker的方法。

NSMutableArray *arrayToLoad = [[NSMutableArray alloc] initWithObjects: obj, nil];
[arrayToLoad addObjectsFromArray: (NSMutableArray*)[valueArrays objectAtIndex: btn.tag]];
if( !picker )
{
    picker = [[WybierzZListyViewController alloc] initWithValues: arrayToLoad useObjectType: YES selectedIndex:0];
    [self.view addSubview: picker.view];
    picker.delegate = self;
    [picker animate];
}
else
{
    picker = [[WybierzZListyViewController alloc] initWithValues: arrayToLoad useObjectType: YES selectedIndex:0];
    [picker reuseWithValues: arrayToLoad useObjectType: YES selectedIndex: indexes[btn.tag]];
    [picker animate];
}

这个else块,尤其是方法reuseWithValues会给我带来很多麻烦,我很可能会把它擦掉。

以前的开发人员是否正确重用以前创建的选择器而不是重新创建新选择器?听起来很可靠,但以后对我来说很难,我想知道我是否可以做到:

picker = [[WybierzZListyViewController alloc] initWithValues: arrayToLoad useObjectType: YES selectedIndex:0];
[self.view addSubview: picker.view];
picker.delegate = self;
[picker animate];

没有其他阻止,并避免内存泄漏。理论上新的ViewController应该在picker变量下分配,但是替换一个。在我更换它之前,我应该以某种方式销毁它吗?

1 个答案:

答案 0 :(得分:1)

在初始化选择器时尝试这样做

    NSMutableArray *arrayToLoad = [[NSMutableArray alloc] initWithObjects: obj, nil];
        [arrayToLoad addObjectsFromArray: (NSMutableArray*)[valueArrays objectAtIndex: btn.tag]];
        if( !picker )
        {

[picker.view removeFromSuperview];
picker.delegate = nil;
picker = nil
        }
            picker = [[WybierzZListyViewController alloc] initWithValues: arrayToLoad useObjectType: YES selectedIndex:0];
            [self.view addSubview: picker.view];
            picker.delegate = self;
            [picker animate];

希望这能解决您的问题。