私はActivityDetailView
と呼ばれるカスタムUIView
をインスタンス化し、親ビューコントローラ内のスクロールビューに追加しました。このカスタムビューが割り当てられると、メモリが追加されるたびに約1MBのメモリが消費され、ビューと親ビューコントローラにはそれぞれdealloc
メソッドが呼び出されてもメモリが解放されないことが表示されます。私はメモリの警告を受け取り、アプリケーションが最終的に殺されてしまっているので、明らかに何か間違っています。メモリがMKMapView/ARCで解放されていません
が原因で、マップビューについての情報/ wを更新しましたが、私はカスタムActivityDetailView
nibファイル内で修正
を必要とし、ズームやユーザーの位置を中心とするマップビューがあります。このマップビューをペン先から削除して画面上に描画しないようにすると、メモリ割り当ての問題が解消されました。しかし、私は明らかにマップビューが必要です。マップビューが範囲外になったときにマップビューのデータが解放されないのはなぜですか?
ビューが表示されているときには、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を現時点でキャッシュする。ビューは基本的にスクロールビューであり、その内部にはマップビューといくつかのラベルといくつかのテーブルビューがあります。テーブルビューには何も入力されていません。スクロールビューの背景イメージ以外のビュー内のイメージはロードされませんが、ビューが終了すると解放されます。
これが問題であるかどうかはわかりません(そうではありません)。しかし、これらの2行のコードは間違っています。detailView = nil; [detailView removeFromSuperview] ;. removeFromSuperViewを呼び出すと、それ以降はnilに設定する必要があります。 – Cosmin
@コスミンよく、私はそれが別のビューに追加されている場合deallocになることはありません問題はないと思う...私は私のOPはちょうど試していたと推測して、それを残しました –
@コスミンAs Grady私はそれが違いを生み出したかどうかを確認するために、その時点で何かを試していただけですが、そうではありませんでした。 – ZeNewb