2013-03-01 9 views
5

Quindi io uso Core Data di memorizzare alcune immagini. (Anche la sottoclasse è generato con le ultime mogenerator)Core Data non rilasciare NSData caricato dalla archiviazione esterna

(e anche io sto usando ARC)

sì lo so ho potuto solo mantenere un punto di riferimento e memorizzarlo sul disco, ma ho pensato:

"Hey fecero un'opzione in modo che io possa fare proprio questo, senza dover gestire io!"

così ho provato e funziona perfettamente tranne che tutti i dati caricati in questo modo viene mai rilasciato.


enter image description here

enter image description here


Nel inizializzazione del ViewController che sta andando essere incaricato di visualizzazione delle immagini mi danno la solita principale NSManagedObjectContext.

E in un metodo chiamato in viewDidAppear Mi è stata UIScrollView con le immagini:

Edit: quindi non è davvero un prendere richiesta Ho un Entity1 che hanno uno-a-molti con le immagini e ho utilizzare per ottenere le immagini ottengo questo Entity1 dallo stesso contesto. Volevo solo per semplificare per spiegare meglio.

- (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]; 
    } 
} 

}

In viewWillDisappear risparmio il NSManagedObjectContext e mi aspetto quando il controllore viene dealloc'ed che tutti i dati sarebbero troppo, ma rimane nella memoria per sempre.

Questa linea in qualche modo lo mantiene non so perché: imageView.image = [UIImage imageWithData:image.image];

Ho trascorso 3 giorni su di esso cercando di utilizzare ogni cosa, Instruments, ricontrollato se non ho tenuto un riferimento forte da qualche parte.

Il fatto è che la UIViewController ottiene dealloc 'ndr che sono sicuro di, lo vedo in Instruments con lo strumento Allocation ma per qualche motivo i dati rimangono nella memoria per sempre fino a quando l'applicazione si blocca .


Ecco la lista del ~ 20 immagini in memoria non farsi dealloc'ed:

enter image description here


Ed ecco i dettagli per il primo oggetto:

enter image description here

Grazie per aver letto fino a qui, sono davvero disperato :(

+0

stai usando arco? – J2theC

+0

Sì, ho dimenticato di dirlo ma l'ho taggato fammi modificare quello – ItsASecret

+2

Il contesto dell'oggetto gestito sopravvive oltre il controller di visualizzazione? Se è così è possibile che tu abbia semplicemente un oggetto grafico con riferimenti circolari e non riesci esplicitamente a [re] correggere i tuoi oggetti? – Tommy

risposta

2

Hai provato a chiamare reset su NSManagedObjectContext dopo aver finito con le immagini? Ciò rimuove qualsiasi oggetto caricato dal grafico dell'oggetto in memoria. Dovranno quindi essere recuperati da disco/db la prossima volta che sono richiesti.

+0

Così strano, ero convinto di averlo già provato! Ma funziona molto grazie – ItsASecret