Nano Hash - криптовалюты, майнинг, программирование

EXC_BAD_ACCESS KERN_INVALID_ADDRESS на контроллерах освобождается после возврата блока

У меня есть UIViewController с UICollectionView, реализующим свои delegate и dataSource. В 95% случаев все работает нормально, но иногда возникает сбой (лог, код и т.д. ниже). Я думаю, что это происходит, когда successBlock из myOperation выполняется в тот же момент, когда контроллер освобождается (но я не уверен).

Учитывая другой вопрос от SOF, я предположим, что myCollectionView == nil, однако delegate все еще куда-то указывает (не следует ли его изменить, насколько я вижу, это просто присвоение свойства). Я понятия не имею, как решить такую ​​​​проблему, кто-нибудь знает?

Журнал сбоев:

MyCollectionViewController.m line 0
__destroy_helper_block_
Crashed: com.apple.main-thread
EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x0000000a

Стек вызовов:

libobjc.A.dylib 
objc_msgSend + 5
retain

UIKit   
-[UICollectionViewController collectionView] + 54

MyAppName   
MyCollectionViewController.m line 30
-[MyCollectionViewController dealloc]

MyAppName   
MyCollectionViewController.m line 0
__destroy_helper_block_

libsystem_blocks.dylib  
_Block_release + 216

MyAppName   
MyDownloaderController.m line 0
__destroy_helper_block_75

libsystem_blocks.dylib  
_Block_release + 216

MyAppName   
MyOperation.m line 0
__destroy_helper_block_19

libsystem_blocks.dylib  
_Block_release + 216

MyAppName   
MyOperation.m line 0
__destroy_helper_block_112

libsystem_blocks.dylib  
_Block_release + 216

UIKit   
UIApplicationMain + 1136

MyAppName
main.m line 15
main

Где строки около 30 в MyCollectionViewController:

- (void)dealloc {
    if ([self isViewLoaded] && self.collectionView) { // line 30
        self.collectionView.delegate = nil;
        self.collectionView.dataSource = nil;
        self.collectionView = nil;
    }
}

Мой успехБлок:

MySuccessHandler successBlock = ^(UIImage *image) {
    if (weakCell) {
        [weakCell.pageImageView setImage:image];
    }
};

  • Итак, вы используете и ARC, и dealloc? 20.05.2014
  • Вы можете переопределить метод dealloc при использовании ARC, вы просто не можете вызвать [super dealloc]; 20.05.2014
  • Конечно. Но почему в этом случае? 20.05.2014
  • @Vive, если вы используете простой контроллер представления с представлением коллекции, вам не нужен этот код в методе dealloc, все это произойдет автоматически. 20.05.2014
  • вполне допустимо использовать -dealloc под ARC! -[super dealloc] автоматически вызывается ARC в конце метода, поэтому вы не должны вызывать его явно. 20.05.2014
  • Удаление кода dealloc решит насущную проблему, поскольку self.collectionView зависает. Однако важно понять, почему он болтается? 20.05.2014
  • Я не помню, в чем была проблема, однако мне нужно было установить collectionView delegate и datasource на nil, потому что в противном случае это давало сбой. Интересно, почему он испорчен? 20.05.2014
  • @Vive Да, похоже, где-то в другом месте происходит что-то неприятное. Удалите код dealloc и снова заставьте его падать, предоставьте новую трассировку стека, а затем покажите объявления @property в своем вопросе. 20.05.2014
  • Где-то должна быть переменная или свойство unsafe_unretained (вместо слабого) или неатомарная строгая переменная или свойство, доступ к которым осуществляется из нескольких потоков (несколько считывателей — это нормально, но несколько писателей или один писатель и несколько считывателей небезопасны). 20.05.2014
  • Делегат @Vive UICollectionViews и свойства dataSource не слабые, а небезопасные_неудержанные. Так что это правда, что вы должны сбросить свойства делегата и источника данных в обработчике -dealloc. К сожалению, UIKit очень мало использует слабые ссылки. 20.05.2014
  • @Michael Это фрагмент из UIKit-›UICollectionView.h @property (nonatomic, assign) id <UICollectionViewDelegate> delegate;. Единственное, что я написал, это то, что это assign, поэтому я полагаю, что это правильное утверждение. Я привык устанавливать для делегатов значение nil, потому что в документации Apple указано, что делегаты UIWebView и MKMapView должны быть обнулены перед выпуском (поэтому, в случае свойства/ivar, дело обнуляется) — так что ради всего этого я обнуляю его со всеми Apple-вещами. Сейчас я отлаживаю, чтобы найти старую проблему без этого метода Dealloc, как написал @trojanfoe. 20.05.2014
  • @trojanfoe Потребуется некоторое время, чтобы отладить его и вывести любые дополнительные журналы, однако, насколько я помню, я включил зомби в инструментах и ​​обнаружил, что счетчик ссылок на collectionView упал до -1, что вызвало сбой. 20.05.2014

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..