#cocoa-touch #memory-management #crash #ipad #reboot
#cocoa-touch #управление памятью #сбой #iPad #перезагрузка
Вопрос:
У меня есть приложение на iPad, которое выходит из строя, вызывая перезагрузку. Этот сбой происходит где-то после метода showMap:(Mappe * mappa):
- (void)viewDidLoad {
moc = [[MapFetcher sharedInstance] managedObjectContext];
[NSThread detachNewThreadSelector:@selector(fetchMap) toTarget:self withObject:nil];
[super viewDidLoad];
}
- (void)fetchMap {
NSAutoreleasePool *threadPool = [[NSAutoreleasePool alloc] init];
Mappe *mappa;
mappa = [[[MapFetcher sharedInstance] fetchManagedObjectsForEntity:@"Mappe"
withPredicate:[NSPredicate predicateWithFormat:@"Citta == %@", map]
withDescriptor:@"Citta"] objectAtIndex:0];
[self performSelectorOnMainThread:@selector(showImage:) withObject:mappa waitUntilDone:YES];
[threadPool release];
}
- (void)showImage:(Mappe *)mappa {
imvMappa = [[UIImageView alloc] initWithFrame:CGRectMake( 0.0, 0.0, 1024.0, 704.0 )];
[imvMappa setImage:[UIImage imageWithData:[mappa Mappa]]];
[scrollView addSubview:imvMappa];
[scrollView setContentSize:CGSizeMake( 1024.0, 704.0 )];
[scrollView setMinimumZoomScale:0.5];
[scrollView setMaximumZoomScale:4.0];
[scrollView setZoomScale:1.0];
[scrollView setContentMode:(UIViewContentModeScaleAspectFit)];
[scrollView setClipsToBounds:YES];
[scrollView setDelegate:self];
[imvMappa release];
[loadingImage stopAnimating];
[waitFor setHidden:YES];
[scrollView setHidden:NO];
}
ScrollView — это выход, Mappe — управляемый объект, и он должен работать нормально, потому что я использую его везде в приложении, и это не вызывает никаких проблем.
Я действительно застрял, что может быть такого, что может вызвать сбой при перезагрузке?
РЕДАКТИРОВАТЬ: Анализ памяти
Я использовал Instruments — Memory Monitor, чтобы посмотреть, что происходит, и он сообщает, что на момент запуска мое приложение использует 17 МБ памяти, в то время как распределение говорит: Текущие байты 883 КБ, всего 4 МБ. Я немного сбит с толку… Когда я запускаю приведенный выше код, я вижу: 2 МБ живых байт (4 ViewControllers), всего 22 МБ, в то время как монитор памяти показывает 77 МБ реальной памяти. Что я должен увидеть, чтобы получить реальный отчет о ситуации?
Ответ №1:
У вас есть один контекст управляемого объекта, и вы передаете управляемый объект из одного потока в другой, а затем используете его. Это «нет-нет». Вместо этого каждый поток должен иметь свой собственный контекст управляемого объекта, и идентификаторы объектов передаются между потоками. Затем принимающий поток извлекает управляемый объект из своего собственного контекста управляемого объекта.
Дополнительная информация: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/CoreData/Articles/cdConcurrency.html