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.");
    }
}

След като инстанцирам споделен екземпляр и извикам метода pripraveManagedDocument, той се срива с това съобщение:

*** 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 няма мои източници, които причиняват срива, така че е нещо вътрешно, по-точно това е нишка 9 (само за да бъда точен), UIDocument File Access и след това виждам само код за сглобяване.   -  person Anatoliy Gatt    schedule 27.03.2013
comment
Дори и да не показва вашия код, обратното проследяване често е полезно.   -  person Tom Harrington    schedule 27.03.2013
comment
@TomHarrington #1 0x31790e06 в -[NSObject(NSObject) doesNotRecognizeSelector:] () Това е, което получавам и на същото място, където възниква сривът. Но в момента не ми е много полезно.   -  person Anatoliy Gatt    schedule 27.03.2013
comment
Това не е обратна следа. Говоря за пълното проследяване на стека от всичко, което се е опитало да извика този метод до мястото, където е възникнало изключението.   -  person Tom Harrington    schedule 27.03.2013
comment
@TomHarrington [[self managedDocument] saveToURL:[[self managedDocument] fileURL] forSaveOperation:UIDocumentSaveForCreating completionHandler: - това е мястото, където изключението е хвърлено от моя код. Нека проверя за пълния стек.   -  person Anatoliy Gatt    schedule 28.03.2013


Отговори (1)


Проблемът е разрешен! Имах категория, която разширява NSURL и има само един метод baseURL, след като премахна тази категория или преименувам метода, всичко работи добре.

person Anatoliy Gatt    schedule 28.03.2013