0

我的应用程序有一个大问题,我想知道如何解决它。我在 SO 中进行了很多搜索,但找不到有效的解决方案。这是我正在处理的场景。

我有一个非 ARC 应用程序,我在其中使用了一堆 ARC 类。这些类属于GMGridView。这些类已通过-fobjc-arc指令添加到项目中。

这是我正在使用的代码(为了简单起见,我只添加了关键部分)。

内存管理部分

- (void)dealloc
{
    [gmGridView setActionDelegate:nil];
    [gmGridView setDataSource:nil];
    [gmGridView release];    

    [super dealloc];
}

ViewDidLoad 部分

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSInteger topBottomSpacing = 20;
    NSInteger leftRifghtSpacing = 75;
    NSInteger itemSpacing = 5;

    UIView* mainView = [self view];

    GMGridView* gridView = [[[GMGridView alloc] initWithFrame:mainView.bounds] autorelease];    
    gridView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    gridView.backgroundColor = [UIColor clearColor];   
    gridView.style = GMGridViewStyleSwap;
    gridView.itemSpacing = itemSpacing;
    gridView.minEdgeInsets = UIEdgeInsetsMake(topBottomSpacing, leftRifghtSpacing, topBottomSpacing, leftRifghtSpacing);
    gridView.centerGrid = NO;
    gridView.actionDelegate = self;
    gridView.dataSource = self;    
    [mainView addSubview:gridView];

    [self setGmGridView:gridView]; // retain policy
}

数据源部分

- (GMGridViewCell *)GMGridView:(GMGridView *)gridView cellForItemAtIndex:(NSInteger)index
{
    CGSize size = [self GMGridView:gridView sizeForItemsInInterfaceOrientation:[[UIApplication sharedApplication] statusBarOrientation]];

    GMGridViewCell *cell = [gridView dequeueReusableCell];    
    if (!cell) {

        cell = [[[GMGridViewCell alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)] autorelease];

        InternalView *view = [[[InternalView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)] autorelease];
        cell.contentView = view;
    }

    return cell;
}

当我使用 Zombie Objects 时,该应用程序运行良好。没有错误。但是当我禁用 Zombie Objects 时,应用程序会在方法中崩溃EXC_BAD_ACCESS 。main这对我来说很奇怪,因为如果启用了 Zombies,我会看到发生在main.

我不太确定的是autorelease代码中的调用,但我认为如果我不将对象放入自动释放池中,它们会泄漏。

GMGridView* gridView = [[[GMGridView alloc] initWithFrame:mainView.bounds] autorelease];

cell = [[[GMGridViewCell alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)] autorelease];

调查了一下,我发现如果我[gmGridView release]dealloc方法中发表评论,应用程序就会停止崩溃。那么这是什么意思?如果我不打电话release,会gmGridView泄漏吗?

你有什么建议吗?先感谢您。

编辑

- (GMGridViewCell *)GMGridView:(GMGridView *)gridView cellForItemAtIndex:(NSInteger)index我在方法中添加了一些代码。第一次忘记加了

(of type )的dealloc方法似乎是问题的根源。这里是代码。InternalViewUIView

- (void)dealloc
{    
    [addButton release]; // it's added to self addSubview, it has also a retain policy
    [imageView release]; // it's added to detView addSubview, it has also a retain policy
    [detView release]; // it's added to self addSubview, it has also a retain policy

    [super dealloc];
}

评论[detView release],崩溃消失了。

4

1 回答 1

1

Flex_Addicted,

从您的代码来看,我们正在查看 MRR 代码(即非 ARC)。如果是 ARC,则不能使用 [super dealloc]、-release 或 -autorelease。

那是你的意图吗?如果是这样,那么你有一个提前释放。我建议您将此类转换为 ARC。ARC 与静态分析器一起,会发现早期的释放问题并处理它们。

安德鲁

于 2012-05-31T22:54:34.173 回答