Всем привет.
У меня небольшой опыт в программировании под айфон, поэтому ответ может быть достаточно простым, однако несколько часов чтения гугла и stackoverflow не принесли должного результата.
Приложение использует библиотеку и рабтает следующим образом.
Вызов метода из библиотеки. В данном методе делается запрос к API и возвращается результат. Приложение дальше работает с этим результатом.
Результат так же кешируется в библиотеке.
Вот примеры кода:
вызов метода из либы
[[DataCache sharedInstance] getData:accessKey onSuccess:^(DataStruct *dataStruct) {
dispatch_async(dispatch_get_main_queue(), ^{
[dataStruct logUrl]; // метод из одной строки: NSLog(@"url: %@", _url);
// всякий другой код
});
} onError:^{
}];
вот так в либе кешируется результат:
// в конструкторе класса DataCache
_mediaInfoCache = [[NSMutableDictionary alloc] init];
// в функции получения данных
NSMutableDictionary *record = [[NSMutableDictionary alloc] init];
[record setObject:dataStruct forKey:@"dataStruct"];
[record setObject:[NSDate date] forKey:@"date"];
[_mediaInfoCache setObject:record forKey:targetName];
DataStruct наследуется от NSObject
Все поля прописаны как nonatomic, strong
Суть проблемы в том, что примерно в 90% случаев при заходе в функцию экземпляра класса, которая выполняет NSLog, мы получаем мусор в полях экземпляра и крэш.
В 10% все ок.
Либа скомпилирована без ARC. Программа с ним
Наблюдения:
- Если выполнять NSLog не из функции эксземпляра класса (logUrl), а логировать прямо из основного блока, то все ок.
- Если дебажить, то проблема возникает очень редко, где-то 1 раз из 20-30. Как 100% повторить под дебагом, непонятно.
- Если убрать dispatch_async, то все почти работает (читай следующий пункт)
- В 100% не работает при повторном запросе, когда данные берутся из кеша.
- Если вынести методы из либы и использовать из в основном приложении, то все работает отлично.
Вопрос, куда смотреть? Какие еще детали нужны?