Mam niestandardowe UIView
o nazwie ActivityDetailView
, które można utworzyć, a następnie dodać do przewijania w nadrzędnym kontrolerem widoku. Po przydzieleniu tego widoku niestandardowego zajmuje on około 1 MB za każdym razem dodatkowej pamięci, a Instruments pokazuje, że pamięć nigdy nie jest uwalniana, mimo że widok i kontroler widoku rodzica są wywoływane. Dostaję ostrzeżenia o pamięci i aplikacja zostaje ostatecznie zabita, więc oczywiście robię coś złego.Brak pamięci dla MKMapView w/ARC
Aktualizacja informacji na temat w/mapa jest przyczyną, ale muszę poprawkę
w pliku stalówki niestandardowe ActivityDetailView
znajduje się mapa, która jest powiększony i wokół miejsca pobytu użytkowników męska. Po usunięciu tego widoku mapy ze stalówki, aby nie rysowała się na ekranie, problemy z alokacją pamięci zniknęły. Jednak oczywiście potrzebuję widoku mapy. Dlaczego dane mapy nie zostałyby zwolnione, gdy widok mapy wykracza poza zakres?
Podczas wyświetlania jest tylko 1 i 1 ActivityDetailViewController
przy życiu. Jak tylko wyskoczę z widoku, już nie żyją. Nie ma sensu, jak pamięć rośnie, mimo że obiekty są zabijane, jak pokazano za pomocą instrumentów. Jeśli widoki nadrzędne są deallocowane, dlaczego dane widoku mapy nie są przydzielane?
Co robię źle lub co powinienem sprawdzić?
Oto widok niestandardowy:
@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");
}
W regulatorze Zobacz główne:
@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];
}
Oto obraz z instrumentami pokazując, że większość pamięci jest z załadunkiem stalówki
Nie mam niczego g do buforowania w tej chwili. Widok jest w zasadzie widokiem przewijania z widokiem mapy wewnątrz i niektórymi etykietami oraz kilkoma widokami tabel. Widoki tabel nie są wypełnione czymkolwiek i nie ładuję żadnych obrazów w widoku innym niż obraz tła dla przewijania, ale to powinno zostać zwolnione, gdy widok robi.
Nie jestem pewien, czy to jest problem (i nie powinien być). Ale te dwie linie kodu są nieprawidłowe detailView = nil; [detailView removeFromSuperview] ;. Powinieneś wywołać removeFromSuperView, a następnie ustawić go na zero. – Cosmin
@ Cosmin cóż, myślę, że to nie ma znaczenia, nie dostałby dealloc, gdyby był jeszcze dodany do innego widoku ... Domyślam się, że nasz OP właśnie próbował czegoś i zostawił go. –
@Cosmin As Grady Powiedziałem, że próbowałem czegoś w tym momencie, aby zobaczyć, czy to coś zmieniło, ale tak się nie stało. – ZeNewb