Неопознанный селектор NSCFString _cfurl отправлен экземпляру

Я работаю с Core Data целую вечность. В настоящее время я хотел бы узнать больше о UIManagedDocument. Я сделал несколько примеров проектов, чтобы узнать больше об этом. Наконец-то я могу перенести этот механизм в реальные проекты. В существующем проекте я в настоящее время реализую основные данные, поэтому я создал модель данных (с тем же именем, что и приложение). Я создал класс для сущности, затем создал категорию с простым методом добавления объектов в базу данных. Наконец я создал синглтон для UIManagedDocument, сейчас он выглядит так:

+ (MDManagedDocument *)sharedDocument {
    static dispatch_once_t dispatchOncePredicate;
    __strong static MDManagedDocument *md = nil;
    dispatch_once(&dispatchOncePredicate, ^{
        md = [[MDManagedDocument alloc] init];
    });
    return md;
}

- (id)init {
    self = [super init];
    if(self) {
        [self setManagedDocument:[[UIManagedDocument alloc] initWithFileURL:[[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@"ThisIsDatabase"]]];
        [[self managedDocument] setPersistentStoreOptions:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]];        
    }
    return self;
}

- (void)prepareManagedDocument {
    if (![[NSFileManager defaultManager] fileExistsAtPath:[[[self managedDocument] fileURL] path]]) {
        [[self managedDocument] saveToURL:[[self managedDocument] fileURL] forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
            if (success) {
                NSLog(@"Managed document was created.");
            } else {
                NSLog(@"Error occured while creating managed document.");
            }
        }];
    } else if([[self managedDocument] documentState] == UIDocumentStateClosed) {
        [[self managedDocument] openWithCompletionHandler:^(BOOL success) {
            if (success) {
                NSLog(@"Managed document was opened.");
            } else {
                NSLog(@"Error occured while opening managed document.");
            }
        }];
    } else if([[self managedDocument] documentState] == UIDocumentStateNormal) {
        NSLog(@"Managed document is opened and prepared for editing and/or reading.");
    }
}

После того, как я создаю общий экземпляр и вызываю метод prepareManagedDocument, он вылетает с этим сообщением:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString _cfurl]: unrecognized selector sent to instance 0xb3774b0'

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

В чем я ошибаюсь?

Заранее спасибо!


person Anatoliy Gatt    schedule 27.03.2013    source источник
comment
Кажется, у вас проблема с преждевременным освобождением, и NSString заполняет пустоту, где должен быть объект, который будет отвечать на это внутреннее сообщение. Включите зомби и отладку malloc_stack.   -  person CodaFi    schedule 27.03.2013
comment
@CodaFi Я включаю оба из них + я профилировал свое приложение с помощью Zombies Trace в Instruments, не получаю никакой полезной информации. Кстати, при втором запуске, когда он пытается открыть документы, он регистрирует сообщение об ошибке, которое я реализовал в блоке, который обрабатывает открытие документа.   -  person Anatoliy Gatt    schedule 27.03.2013
comment
@CodaFi позвольте мне попробовать запустить его на устройстве.   -  person Anatoliy Gatt    schedule 27.03.2013
comment
Попробуйте установить точку останова для всех исключений. Затем отладчик вмешается, когда возникнет исключение, и вы, по крайней мере, будете лучше понимать, что его вызывает.   -  person Tom Harrington    schedule 27.03.2013
comment
@TomHarrington Это было первое, что я сделал. В Debug Navigator нет моих источников, которые вызывают сбой, значит это что-то внутреннее, точнее это Thread 9(если быть точным), UIDocument File Access, а дальше я вижу просто код сборки.   -  person Anatoliy Gatt    schedule 27.03.2013
comment
Даже если он не показывает ваш код, обратная трассировка часто бывает полезна.   -  person Tom Harrington    schedule 27.03.2013
comment
@TomHarrington #1 0x31790e06 in -[NSObject(NSObject) DoesNotRecognizeSelector:] () Это то, что я также получаю в том же месте, где происходит сбой. Но мне это сейчас мало помогает.   -  person Anatoliy Gatt    schedule 27.03.2013
comment
Это не обратная связь. Я говорю о полной трассировке стека от того, что пыталось вызвать этот метод, до места, где произошло исключение.   -  person Tom Harrington    schedule 27.03.2013
comment
@TomHarrington [[self manageDocument] saveToURL: [[self manageDocument] fileURL] forSaveOperation:UIDocumentSaveForCreating completeHandler: — то есть из моего кода выбрасывается исключение. Позвольте мне проверить полный стек.   -  person Anatoliy Gatt    schedule 28.03.2013


Ответы (1)


Проблема решена! У меня была категория, которая расширяет NSURL, и имеет только один метод baseURL, после того, как я удаляю эту категорию или переименовываю метод, все работает нормально.

person Anatoliy Gatt    schedule 28.03.2013