Контекст не правильно подключается [дублировать]

Строковые литералы хранятся таким образом, что они доступны для жизни программы; если вы пишете

char *ptr = "This is a test";

, все, что записано на ptr, это адрес строкового литерала "This is a test". Даже если переменная ptr выходит за пределы области видимости, строковый литерал продолжает существовать в своем собственном разделе памяти, который не тот же раздел, используемый malloc (по крайней мере, не логический уровень). Обратите внимание, что несколько экземпляров одного и того же строкового литерала могут разрешаться в одном месте; IOW, учитывая

char *p0 = "This is a test";
char *p1 = "This is a test";

p0 и p1, могут содержать один и тот же адрес (это зависит от того, сопоставлено ли несколько вхождений строковых литералов в одно и то же место).

Когда вы вызываете Container_new, все, что вы делаете, копирует адрес в container->buffer и globalBuffer; оба заканчиваются, указывая на то же самое, что существует независимо от любого из них. free -ing container не влияет на строковый литерал, на который указывает container->buffer, поэтому printf(globalBuffer); по-прежнему отображается "Test-string.".

Итак, вы должны not вызывать

free(container->buffer);

для этой конкретной программы, так как вы не назначили результат malloc, calloc или realloc.

Если вы, OTOH, вы написали Container_new как

Container* Container_new(char* buffer) 
{
  Container* container = malloc(sizeof(Container));
  container->buffer    = malloc(strlen(buffer) + 1);  // Allocate memory to 
  if (container->buffer)                              // store a *new* instance
  {                                                   // of the input string. 
    strcpy(container->buffer, buffer);                // This will need to be 
  }                                                   // freed before freeing
  globalBuffer         = buffer;                      // the container
  return container;
}

, то вы хотели бы освободить container->buffer перед освобождением container.

14
задан Valentin Shamardin 12 August 2016 в 17:41
поделиться

4 ответа

- (NSManagedObjectContext *)managedObjectContext
{
    if (managedObjectContext != nil) return managedObjectContext;

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {

        managedObjectContext = [[NSManagedObjectContext alloc] init];
        [managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return managedObjectContext;
}
  • Вы не предоставили ленивую реализацию загрузки persistentStoreCoordinator
  • , поэтому coordinator всегда будет nil
  • , поэтому вы всегда будете возвращаем nil из этого метода
  • , что означает, что вы всегда получите ошибку выше.

Чтобы объяснить ошибку:

+ entityForName: nil не является законным параметром NSManagedObjectContext, который ищет имя сущности 'Account'

Это не сразу видно из его чтения, но это означает, что nil не является законным для передать для контекста управляемого объекта. В первом чтении похоже, что вы делаете entityForName:nil, но это не так.

Чтобы устранить проблему, вам нужно будет предоставить действительный постоянный координатор хранилища. У меня есть небольшая статья здесь , в которой объясняется, как мало кода вам нужно настроить базовый стек данных, это может вам помочь.

35
ответ дан jrturton 16 August 2018 в 12:05
поделиться
  • 1
    Спасибо, он работал для имени пользователя. Я изменил делегат приложения (см. Выше), но теперь я получаю ошибку: - [NSManagedObject setPassword:]: непризнанный селектор, отправленный экземпляру – ferrojr 9 December 2013 в 18:37
  • 2
    Ну, это совсем другой вопрос. Похоже, что вы не определили правильный подкласс в своей модели данных (для заполнения есть поле «Имя» и «Класс») – jrturton 9 December 2013 в 18:43
  • 3
    Моя модель данных имеет один атрибут, который является именем пользователя. И имя объекта - это Account, класс, который показывает, что NSManagedObject, который я редактировал ранее, не уверен, что это правда. – ferrojr 9 December 2013 в 18:59
  • 4
    Вы должны установить класс для Учетной записи и сгенерировать файлы Account.h и Account.m, выбрав объект и выбрав editor - & gt; создать подкласс NSManagedObject. – jrturton 9 December 2013 в 19:08
  • 5
    Это мой вывод: имя пользователя: пароль Jorge: & lt; 70617373 776f7264 & gt; Я предполагаю, что это сработало, верно? – ferrojr 9 December 2013 в 19:21

В моем случае я использую несколько контекстов (родительский / дочерний) с разными типами параллелизма для повышения производительности. Я имею три контекста:

  1. storeContext, который является единственным контекстом, [
  2. viewContext], родительский элемент которого storeContext
  3. backgroundContext, родительский должен был viewContext , но я забыл установить backgroundContext.parent = viewContext.

Сохранение объекта в backgroundContext вызвало ту же ошибку ...

+ entityForName: nil не является законным параметром NSManagedObjectContext, который ищет имя объекта ...

... потому что backgroundContext не входит в цепочку контекста родителя / ребенка.

Установка backgroundContext с parent на viewContext установила цепочку обратно в постоянный координатор хранилища и разрешила ошибку.

0
ответ дан Clay Ellis 16 August 2018 в 12:05
поделиться

Я столкнулся с этой ошибкой entityForName: nil, но в итоге это была красная селедка, которая проявлялась только при выполнении модульных тестов на моем CI. Во время тестирования приложение столкнулось с некоторыми странными условиями потоковой передачи, вызванными HTML-импортером NSAttributedString . Асинхронная отправка в основную очередь для взаимодействия с Core Data происходила так же, как создавался файл NSAttributedString из HTML.

Просто опубликуйте мой опыт здесь, если он окажется полезным для кого-то другого. :) [/ Д2]

0
ответ дан tylermilner 16 August 2018 в 12:05
поделиться

Это может произойти из-за несоответствия имени объекта и имени его класса. Убедитесь, что ваш объект Account имеет соответствующее имя класса в файле .xcdatamodeld.

-1
ответ дан Zend 16 August 2018 в 12:05
поделиться
  • 1
    В сообщении об ошибке указано, что параметр managedObjectContext равен нулю, это не имеет ничего общего с моделью – jrturton 9 December 2013 в 17:52
Другие вопросы по тегам:

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