Строковые литералы хранятся таким образом, что они доступны для жизни программы; если вы пишете
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
.
- (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'
blockquote>Это не сразу видно из его чтения, но это означает, что
nil
не является законным для передать для контекста управляемого объекта. В первом чтении похоже, что вы делаетеentityForName:nil
, но это не так.Чтобы устранить проблему, вам нужно будет предоставить действительный постоянный координатор хранилища. У меня есть небольшая статья здесь , в которой объясняется, как мало кода вам нужно настроить базовый стек данных, это может вам помочь.
В моем случае я использую несколько контекстов (родительский / дочерний) с разными типами параллелизма для повышения производительности. Я имею три контекста:
storeContext
, который является единственным контекстом, [viewContext
], родительский элемент которого storeContext
backgroundContext
, родительский должен был viewContext
, но я забыл установить backgroundContext.parent = viewContext
. Сохранение объекта в backgroundContext
вызвало ту же ошибку ...
+ entityForName: nil не является законным параметром NSManagedObjectContext, который ищет имя объекта ...
blockquote>... потому что
backgroundContext
не входит в цепочку контекста родителя / ребенка.Установка
backgroundContext
сparent
наviewContext
установила цепочку обратно в постоянный координатор хранилища и разрешила ошибку.
Я столкнулся с этой ошибкой entityForName: nil
, но в итоге это была красная селедка, которая проявлялась только при выполнении модульных тестов на моем CI. Во время тестирования приложение столкнулось с некоторыми странными условиями потоковой передачи, вызванными HTML-импортером NSAttributedString . Асинхронная отправка в основную очередь для взаимодействия с Core Data происходила так же, как создавался файл NSAttributedString
из HTML.
Просто опубликуйте мой опыт здесь, если он окажется полезным для кого-то другого. :) [/ Д2]
Это может произойти из-за несоответствия имени объекта и имени его класса. Убедитесь, что ваш объект Account имеет соответствующее имя класса в файле .xcdatamodeld.