这是我想要实现的。 1.搜索所有的文件2.找到所有.jpg文件的搜索3.在所有.jpg文件路径保存到NSMutableArray的目标c:在线程中将对象添加到NSMutableArray时出错
这里是代码:
创造了NSMutableArray中:
NSMutableArray *jpgFiles = [[[NSMutableArray alloc]init]autorelease];
搜索下(/用户/)路径(开始NSThread在这里)所有的父文件夹:
NSString* filePath = [url path]; NSArray *dirFiles = [[NSFileManager defaultManager]contentsOfDirectoryAtPath:filePath error:nil]; if([dirFiles count]!=0) { for (int j=0; j<[dirFiles count]; j++) { NSString* pathExtension = [[dirFiles objectAtIndex:j] pathExtension]; //if extension is null, we forwards to next level. if ([pathExtension isEqualTo:@""]) { @autoreleasepool { [NSThread detachNewThreadSelector:@selector(searchingPicture:) toTarget:self withObject:[filePath stringByAppendingPathComponent:[dirFiles objectAtIndex:j]]]; } } else { //if find jpg in this level, save into array if([pathExtension isEqualTo:@"JPG"]) { [jpgFiles addObject:[filePath stringByAppendingPathComponent:[dirFiles objectAtIndex:j]]]; } } } }
继续搜索子文件夹的休息和保存正确的文件路径分为数组:
-(void)searchingPicture:(NSString*)path { NSFileManager *fileManager = [[[NSFileManager alloc] init] autorelease]; NSURL *directoryURL = [NSURL URLWithString:[path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; NSArray *keys = [NSArray arrayWithObject:NSURLIsDirectoryKey]; NSDirectoryEnumerator *enumerator = [fileManager enumeratorAtURL:directoryURL includingPropertiesForKeys:keys options:0 errorHandler:^(NSURL *url, NSError *error) { // Handle the error. // Return YES if the enumeration should continue after the error. return YES; }]; for (NSURL *url in enumerator) { NSError *error; NSNumber *isDirectory = nil; if (! [url getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:&error]) { // handle error } else if (! [isDirectory boolValue]) { // No error and it’s not a directory; do something with the file if([[[url path] pathExtension]isEqualTo:@"JPG"]) { //This line gives me error !!! [jpgFiles addObject:[url path]]; } } } }
错误:(在开始时,它工作正常,并保存许多不同的文件转换成数组,但节省约50个文件后,它开始在最后给我错误和崩溃)。
这里是正确的元素添加到数组:
以下是错误消息:
-[NSPathStore2 addObject:]: unrecognized selector sent to instance 0x10011d4d0
然而,甚至发生这种错误,它仍保持节省一些的路径然后它会抛出另一个错误:
An uncaught exception was raised
你可以告诉我如何解决吗?谢谢 !!
该错误指示内存管理问题。也许问题是在'jpgFiles'上使用'autorelease'。当你创建它时,不要使用'autorelease',而是在你真正完成阵列时调用'release'。 – rmaddy
你是对的。谢谢 !!!! :]但是为什么我应该使用release而不是autorelease? –
这是一个很大的问题。这个过于简单的原因是,在当前运行循环结束时会清除自动释放的对象。查看“NSObject autorelease”的文档。应该有一些其他文档的链接可以深入讨论。 – rmaddy