我的应用程序有一个大问题,我想知道如何解决它。我在 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
方法似乎是问题的根源。这里是代码。InternalView
UIView
- (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]
,崩溃消失了。