Задать вопрос
@Fly3110
web developer

Почему удаляется переменная в objective C?

Всем привет.

У меня небольшой опыт в программировании под айфон, поэтому ответ может быть достаточно простым, однако несколько часов чтения гугла и 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% не работает при повторном запросе, когда данные берутся из кеша.
- Если вынести методы из либы и использовать из в основном приложении, то все работает отлично.

Вопрос, куда смотреть? Какие еще детали нужны?
  • Вопрос задан
  • 52 просмотра
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы