我有一个自定义UIView
调用ActivityDetailView
,我实例化,然后添加到父视图控制器内的滚动视图。分配此自定义视图时,每增加一次内存就会占用大约1mb的时间,并且Instruments显示内存永远不会被释放,即使视图和父视图控制器各自都调用了它们的dealloc
方法。我收到内存警告,应用程序最终被杀死,所以我显然做错了什么。内存不被释放MKMapView w/ARC
更新W绕地图视图是事业/信息,但我需要一个修复
在自定义ActivityDetailView
笔尖文件,则存在被放大和周围的用户的位置为中心的地图视图。当我从笔尖移除该地图视图时,它不会在屏幕上绘图,内存分配问题就会消失。不过,我显然需要地图视图。为什么当地图视图超出范围时地图视图的数据不会被释放?
当视图显示时,只有1 ActivityDetailView
和1 ActivityDetailViewController
存活。只要我将视图从堆栈中弹出,它们就不再存在。即使通过仪器显示对象被杀死,内存的持续增长也没有意义。如果父视图解除分配,为什么地图视图数据未被解除分配?
我在做什么错,或者我应该检查什么?
这里是自定义视图:
@interface ActivityDetailView()
{
CLLocation *location;
__weak id parentViewController;
int scrollViewX;
ImageUtility *imageUtility;
}
@end
@implementation ActivityDetailView
-(id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
NSArray *xibViews = [[NSBundle mainBundle] loadNibNamed:@"ActivityDetailView" owner:nil options:nil];
if ([xibViews count] < 1) return nil;
ActivityDetailView * xibView = [xibViews objectAtIndex:0];
[xibView setFrame:frame];
self = xibView;
}
return self;
}
- (id)initWithLocation:(CLLocation *)loc parentController:(id)parent
{
self = [self initWithFrame:CGRectMake(0, 0, 320, 1000)];
if (self)
{
imageUtility = [ImageUtility sharedManager];
location = loc;
parentViewController = parent;
scrollViewX = 0;
[self centerMapForActivityLocation];
[self addPhotoButtonWithImageNamed:@"addActivityPhoto.png" target:parentViewController selector:@selector(addPhotoToActivity:)];
}
return self;
}
- (void)dealloc
{
NSLog(@"ActivityDetailView was dealloced");
}
在父视图控制器:
@interface ActivityDetailViewController()
{
ActivityDetailView *detailView;
}
@end
@implementation ActivityDetailViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Some code left out for clarity
[self setupView];
}
- (void)didReceiveMemoryWarning
{
NSLog(@"Purging image cache");
[[ImageUtility sharedManager] purgeCache];
}
- (void)dealloc
{
// These essentially do nothing to help the problem
detailView.mapView = nil;
[detailView removeFromSuperview];
detailView = nil;
self.scrollView = nil;
NSLog(@"ActivityDetailViewController was dealloced");
}
- (void)setupView
{
// Add the activity detail view to the scroll view
detailView = [[ActivityDetailView alloc] initWithLocation:self.activityLocation parentController:self];
[self.scrollView addSubview:detailView];
self.scrollView.contentSize = detailView.frame.size;
// Setup the map view
detailView.mapView.delegate = self;
MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];
annotation.coordinate = self.activityLocation.coordinate;
[detailView.mapView addAnnotation:annotation];
if (self.activity.mapImageName) {
detailView.mapView.scrollEnabled = YES;
detailView.mapView.zoomEnabled = YES;
} else {
detailView.mapView.scrollEnabled = NO;
detailView.mapView.zoomEnabled = NO;
}
// Add the weather area to the view
dayView = [[DailyButtonView alloc] initWithFrame:CGRectMake(0, -17, 60, 70)];
dayView.hidden = YES;
[detailView.weatherView addSubview:dayView];
}
下面是从仪器显示,大多数的存储器是从笔尖加载的图像
我没有任何东西g暂时缓存。该视图基本上是一个滚动视图,其中包含一个mapview,一些标签和一些表视图。表视图没有填充任何东西,我不在视图内加载任何图像,除了滚动视图的背景图像以外,但是当视图发生时,它应该被释放。
不知道这是否是问题(也不应该是)。但是这两行代码是错误的detailView = nil; [detailView removeFromSuperview] ;.您应该调用removeFromSuperView,然后将其设置为nil。 – Cosmin 2013-05-07 13:23:17
@Cosmin我认为没关系,如果它仍然被添加到另一个视图中,它不会达到dealloc ...我猜我们的OP只是在尝试一些东西,并将它留下。 – 2013-05-07 13:27:40
@Cosmin As Grady说,我只是在尝试任何事情,看看它是否有所作为,但事实并非如此。 – ZeNewb 2013-05-07 13:31:30