我继承了以下代码:
- (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];
}
答案 0 :(得分:0)
因为aURL在这里是零,所以在调用super init之前,你应该检查aURL是否为nill。如果(aURL)会这样做。
文件URL,用于标识应用程序沙箱中要写入文档数据的位置。传入nil或空URL会导致抛出NSInvalidArgumentException。
实际上,您在initWithFileURL中提供的URL不是有效的URL,而是路径。不要忘记有效的URL需要一个方案;对于文件,这是“file://”。尝试使用[NSURL fileURLWithPath:]
url = [NSURL fileURLWithPath:newFilePath];
在调用initWithFileURL方法之前转换它。
如果aURL是有效的网址,可能只是检查自己会做的工作
-(id)initWithFileURL:(NSURL *)url {
self = [super initWithFileURL:url];
if(self) {
}
return self;
}