0

我一直在思考为什么我会得到我的结果,但是人们会注意到我是一个初学者 objc 开发者。

忽略我正在尝试做的事情有不同的方法(例如扩展 NSFileManager)这一事实,如果不是太多的业余错误,我会喜欢一些输入。

如果我在返回实例方法 listFilesForURL 期间中断,则返回的 NSArray 对象“theFiles”很好。我得到了我期望的结果,但是在 main.c 中,'listOfFiles' 总是为零。

有人可以指出我没有看到什么吗?非常感谢任何输入!

主程序

#import <Foundation/Foundation.h>
#import "FileManipulator.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        // insert code here...

        FileManipulator *myFileManipulator = [[FileManipulator alloc] init];
        NSArray *listOfFiles = [myFileManipulator listFilesForURL:[NSURL fileURLWithPath:@"/tmp"]];

    }
    return 0;
}

文件操纵器.h

#import <Foundation/Foundation.h>

@interface FileManipulator : NSObject

- (id)initAndCopySourceURL:(NSURL *)srcURL toDestination:(NSURL *)destURL;
- (NSArray*)listFilesForURL:(NSURL *)srcURL;

@end

文件操纵器.m

#import "FileManipulator.h"

@implementation FileManipulator

- (id)initAndCopySourceURL:(NSURL *)srcURL toDestination:(NSURL *)destURL {

    self = [super init];
    if (self != nil) {
        NSError *copyError;
        NSFileManager *fileManager = [NSFileManager defaultManager];
        if ([fileManager fileExistsAtPath:[srcURL relativePath]]) {
            NSLog(@"File exists: %@", [srcURL relativePath], nil);
            if ([fileManager copyItemAtURL:srcURL toURL:destURL error:&copyError]) {
                NSLog(@"File copied successfully to %@", [destURL relativePath]);
            } else {
                NSLog(@"File not copied, error was: %@", [copyError localizedFailureReason] );
            }
        }

    }
    NSLog(@"Init. FileManipulator Class");

    return self;
}

- (NSArray *)listFilesForURL:(NSURL *)srcURL {

    NSError *listFilesError;
    NSLog(@"listFilesForURL Entered");
    NSFileManager *myFileManager = [NSFileManager defaultManager];
    NSArray *theFiles = [myFileManager contentsOfDirectoryAtPath:[srcURL path] error:&listFilesError];
    return theFiles;
}

@end
4

2 回答 2

1

我看到这可能失败的两个原因:

  1. 您的文件 URL 不可访问、不存在或不是 NSFileManager 喜欢的格式。应用程序临时目录的路径应使用NSTemporaryDirectory().

  2. ARC 或没有 ARC,任何你不使用的东西,你都在丢失——内存管理方面就是这样。忽略这样一个事实,即您的 main 包含未引用的变量,这些变量已经成熟,可以作为死代码被剥离,当@autoreleasepool到达该块的末尾时,其中的任何内容都应该是死的(因为它非常接近return语句。自动释放池涉及任何类型的运行循环的应用程序都不保证对象的生命周期)。这意味着您应该在调用该方法后立即记录日志,以便在它被释放之前至少获得一个可靠的立足点。

于 2013-09-10T19:33:25.823 回答
0

尝试这样做:

NSString  *tmp = [NSHomeDirectory() stringByAppendingPathComponent:@"tmp"];
NSArray *listOfFiles = [myFileManipulator listFilesForURL:[NSURL fileURLWithPath:tmp]];
于 2013-09-10T19:28:42.710 回答