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.
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:
Ed ecco i dettagli per il primo oggetto:
Grazie per aver letto fino a qui, sono davvero disperato :(
stai usando arco? – J2theC
Sì, ho dimenticato di dirlo ma l'ho taggato fammi modificare quello – ItsASecret
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