2013-03-01 8 views
5

Używam więc Core Data do przechowywania kilku obrazów. (Również podklasa jest generowana z najnowszej mogenerator)Dane podstawowe nigdy nie zwalniają NSData załadowanego z pamięci zewnętrznej.

(a także używam ARC)

Tak wiem, może po prostu zachować odniesienie i zapisać go na dysku, ale pomyślałem:

"Hej, oni zrobili opcję, więc mogę to zrobić bez konieczności samodzielnego zarządzania!"

Tak więc spróbowałem i działa idealnie, z wyjątkiem wszystkich danych wczytanych w ten sposób: nigdy nie opublikowano.


enter image description here

enter image description here


W inicjalizacji ViewController kto gonna be odpowiedzialny za wyświetlanie obrazów daję zwykle główny NSManagedObjectContext.

A w metodzie zwanej w viewDidAppear I ustanowiony na UIScrollView z obrazów:

Edit: Więc to nie jest tak naprawdę pobrać wniosek Mam Entity1 które mają jeden-do-wielu z obrazami i I użyj go, aby uzyskać obrazy Otrzymuję encję 1 z tego samego kontekstu. Chciałem tylko uprościć wyjaśnienie lepiej.

- (void)setupScrollViewWithEntity1:(Entity1 *)entity1 { 
    DDLogVerbose(@"-- %@ : SETUP SCROLL VIEW --", self); 
    // I remove any previous subviews 
    [self.scrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; 
    self.scrollView.contentSize = self.scrollView.frame.size; 

    /* Here I get the imagesArray with a NSFetchRequest */ 
    //So it's not really a fetch request I have an `Entity1` which have one-to-many with images and I use it to get the images 
    NSSet *imagesSet = entity1.images; 


    // So I have an NSArray holding all the Image object 
    for (Image *image in imagesSet) { 
     CGRect frame = self.scrollView.frame; 
     frame.origin.x = image.numberValue*frame.size.width; 
     UIScrollView *scrollView = [[UIScrollView alloc]initWithFrame:frame]; 
     scrollView.contentSize = self.scrollView.frame.size; 
     UIImageView *imageView = [[UIImageView alloc]initWithFrame:self.scrollView.frame]; 
     imageView.image = [UIImage imageWithData:image.image]; 
     imageView.contentMode = UIViewContentModeScaleAspectFit; 
     imageView.userInteractionEnabled = YES; 
     [scrollView addSubview:imageView]; 
     scrollView.delegate = self; 
     scrollView.minimumZoomScale = 1.0; 
     scrollView.maximumZoomScale = 3.0; 
     [self.scrollView addSubview:scrollView]; 
    } 
} 

}

W viewWillDisappear I zapisać NSManagedObjectContext i Spodziewam się, gdy kontroler dostaje dealloc'ed że wszystkie dane byłyby zbyt, ale pozostaje w pamięci na zawsze.

Linia ta jakoś zachowuje to nie wiem dlaczego: imageView.image = [UIImage imageWithData:image.image];

spędziłem 3 dni na nim próbują wykorzystać wszystko, Instruments, ponownie sprawdzić, czy nie zachować gdzieś silne odniesienie.

Rzecz jest UIViewController dostaje dealloc „ed, że jestem pewien, widzę go w Instruments z narzędziem Allocation ale z jakiegoś powodu dane pozostają w pamięci na zawsze, aż do aplikacji ulega awarii.


Oto lista ~ 20 zdjęć w pamięci nie uzyskiwanie dealloc'ed:

enter image description here


A oto szczegóły dla pierwszego obiektu:

enter image description here

Dziękuję za przeczytanie do tego czasu, jestem Naprawdę zdesperowani :(

+0

Czy używasz łuku? – J2theC

+0

Tak, zapomniałem o tym wspomnieć, ale oznaczyłem to, pozwól mi edytować, że – ItsASecret

+2

Czy kontekst obiektu zarządzanego zachowuje się poza kontrolerem widoku? Jeśli tak, to po prostu masz wykres obiektowy z odwołaniami cyklicznymi i wyraźnie nie udaje Ci się [ponownie] uszkodzić twoich obiektów? – Tommy

Odpowiedz

2

Czy próbowali Państwo zadzwonić pod numer reset na NSManagedObjectContext po wykonaniu zdjęć? To eksmituje wszystkie załadowane obiekty z wykresu obiektów w pamięci. Następnie będą musiały zostać pobrane z dysku/bazy danych przy następnym żądaniu.

+0

Dziwne, byłem przekonany, że już to wypróbowałem! Ale działa bardzo dziękuję – ItsASecret

Powiązane problemy