我正在查看我的代码并尝试处理正确的内存管理。这段代码:
imageView = [[[UIImageView alloc] initWithImage:myImage] autorelease];
导致我的应用程序崩溃。我在导航栏控制器中使用多个视图控制器。该应用程序工作正常:我可以从第一个视图控制器(tableview)中选择一个人,它将我放到那些人物照片的列表中,然后我可以从该视图控制器(tableview)中选择一张照片并移动到最终视图用于查看照片的滚动视图。一旦我回到导航栏上,就会加载上一个视图(桌面视图中的照片列表)但是应用程序在使用此代码取消选择行之前崩溃:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if(RowSelected != nil)
{
[MainTableView deselectRowAtIndexPath:RowSelected animated:YES];
}
}
当用户点击一行时,将存储所选行。
如果我将代码保留为:
imageView = [[UIImageView alloc] initWithImage:myImage];
该应用运行良好。难道我做错了什么?我不需要自动释放吗?
答案 0 :(得分:3)
确保在视图控制器的-loadView
或-viewDidLoad
中创建该视图,而不是在其初始值设定项中创建。当控制器的视图离开屏幕时,它通常会被释放,从而释放其子视图;因此,您不应期望您对imageView
的引用保持有效。如果你出于某种原因需要将图像视图保留在内存中,即使在视图控制器的屏幕外,那么在创建它时也可以不调用-autorelease
;只需确保在控制器的[imageView release];
中调用-dealloc
。
答案 1 :(得分:0)
当您将imageView标记为自动释放时,它将在下次运行循环时释放。如果您仍然在某处引用或使用imageView,那么您正在使用指向已释放的堆空间的指针。堆空间将被覆盖(迟早),您将引用垃圾和崩溃。
我认为正确的解决方案是imageView应该是一个保留的属性,但我不确定你在使用imageView做什么,所以我只是在猜测。如果将imageView添加到视图控制器视图中,它将将其保留在子视图数组中。最重要的是,它必须由使用它的人保留。
您可以在.h文件中使imageView成为保留属性:
@property (nonatomic, retain) UIImageView* imageView;
然后使用setter,它将保留它:
UIImageView* tmpIV = [[UIImageView alloc] initWithImage:myImage];
self.imageView = tmpIV; // copy the pointer, setter will retain it
[tmpIV release]; // release the original alloc
不要忘记@synthesize来创建setter / getter。
答案 2 :(得分:0)
ImageView在我的.h。我在我的-viewDidLoad中使用了这一行,一旦它离开屏幕我就不需要它了:
imageView = [[[UIImageView alloc] initWithImage:myImage] autorelease];
我认为我正在做的是将分配的UIImageView分配给我的imageView,如果我自动释放,那么由于我的-dealloc发布了,retaincount将会关闭? (纠正我,如果我错了)
如果我检查我的-dealloc:
- (void)dealloc {
NSLog(@"%i", [photo retainCount]);
[photo release];
NSLog(@"%i", [imageView retainCount]);
[imageView release];
[super dealloc];
}
在NSLog中,imageView的重新计数是1,我猜测当它执行[super dealloc]时,由于[imageView发布]它已经尝试从imageView获取1次保留计数?
如果我有这一行:imageView = [[UIImageView alloc] initWithImage:myImage];
那么NSLog中的保留计数是2,1进入[supper dealloc]
如果我使用 kk6yb 的方法,那么该应用程序没有任何问题,但我认为我不应该这样做,因为如果我检查我的保留计数dealloc他的方式它在NSLog中也是2 ...
我很困惑,我昨天读了很多关于内存管理的内容,以便更好地掌握内容,因为我在-dealloc中发布了imageView,我相信我不需要在该行上自动发布?
有没有办法检查xCode中的内存泄漏?
谢谢!