调用initWithFileURL时出错

时间:2014-08-18 14:16:51

标签: objective-c

我继承了以下代码:

- (id)initWithFileURL:(NSURL *)aURL {
    if((self = [super initWithFileURL:aURL]) != nil) {

此init方法位于一个继承自UIManagedDocument

的类中

当它击中“if”行时,我得到:

*由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'* - [NSURL initFileURLWithPath:]:nil string parameter'

到目前为止,我一直无法弄清楚原因。我已经在我从中获取的遗留项目中测试了这个代码,它在那里工作得很好。在两个项目中填充aURL( aURL不是,似乎没问题)调用该方法。我将这个遗留代码复制到新项目中会出现什么问题,导致它抛出此错误?感谢。

编辑已添加:

在“if”行之前立即插入NSLog,为aURL输出以下值

file:///var/mobile/Applications/427BABD3-9D9D-41B7-8B99-1586E93FFADD/Documents/3FE3861A-CA4B-4859-B14B-5CC4A1C6E7B4.khp

编辑添加,这里是堆栈跟踪上方的代码:

- (id)initWithFileURL:(NSURL *)aURL withFormType:(KHFormType)aFormType {
    if((self = [self initWithFileURL:aURL]) != nil) {
        self.formType = aFormType;
    }
    return self;
}
...


NSURL *uniqueFileURL = [[self class] uniqueFilenameInDirectory:documentURL withFileExtension:DOCUMENT_EXT];

//    KHDocument *aDocument = [[KHDocument alloc] initWithFileURL:uniqueFileURL withFormType:inputPaceForm];
    NSLog(@"%d", [KHProfileInfoController getFormType:@"inputPaceForm"]);
    KHDocument *aDocument = [[KHDocument alloc] initWithFileURL:uniqueFileURL withFormType:[KHProfileInfoController getFormType:@"inputPaceForm"]];
...

+ (NSURL *)uniqueFilenameInDirectory:(NSURL *)dirURL withFileExtension:(NSString *)fileExtension {
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *existingFiles = [fileManager contentsOfDirectoryAtPath:[dirURL path] error:nil];
    NSString *uniqueFilename;

    do {
        CFUUIDRef newUniqueId = CFUUIDCreate(kCFAllocatorDefault);
        CFStringRef newUniqueIdString = CFUUIDCreateString(kCFAllocatorDefault, newUniqueId);

        uniqueFilename = [[[dirURL path] stringByAppendingPathComponent:(__bridge NSString *)newUniqueIdString] stringByAppendingPathExtension:fileExtension];

        CFRelease(newUniqueId);
        CFRelease(newUniqueIdString);
    } while ([existingFiles containsObject:uniqueFilename]);

    return [NSURL fileURLWithPath:uniqueFilename];
}

1 个答案:

答案 0 :(得分:0)

因为aURL在这里是零,所以在调用super init之前,你应该检查aURL是否为nill。如果(aURL)会这样做。

文件URL,用于标识应用程序沙箱中要写入文档数据的位置。传入nil或空URL会导致抛出NSInvalidArgumentException

实际上,您在initWithFileURL中提供的URL不是有效的URL,而是路径。不要忘记有效的URL需要一个方案;对于文件,这是“file://”。尝试使用[NSURL fileURLWithPath:]

构建文件网址
url = [NSURL fileURLWithPath:newFilePath];

在调用initWithFileURL方法之前转换它。

Reference UIDocument

如果aURL是有效的网址,可能只是检查自己会做的工作

-(id)initWithFileURL:(NSURL *)url {
self = [super initWithFileURL:url];
if(self) {

}

return self;
}

Reference