Objective-C - 从自定义实例方法返回NSArray返回nil

时间:2013-09-10 19:13:59

标签: objective-c class return return-value

我一直在绞尽脑汁为什么我会得到我的结果,但是人们会注意到我是初学者对象。

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

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

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

的main.c

#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;
}

FileManipulator.h

#import <Foundation/Foundation.h>

@interface FileManipulator : NSObject

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

@end

FileManipulator.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

2 个答案:

答案 0 :(得分:1)

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

  1. 您的文件网址不可访问,不存在或者不是NSFileManager喜欢的格式。应使用NSTemporaryDirectory()

  2. 访问应用程序临时目录的路径
  3. ARC或没有ARC,任何你没有使用的东西,你正在失去 - 记忆管理方面。忽略这样一个事实,即你的主要包含未被引用的变量,这些变量已经成熟,可以被剥离为死代码,当到达@autoreleasepool块的末尾时,它内部的任何内容都应该是死的(因为它非常接近一个return语句。涉及任何类型的运行循环的应用程序的自动释放池不保证对象生命周期)。这意味着你应该在调用方法后立即记录,这样你就可以在取消分配之前获得可靠的立足点。

答案 1 :(得分:0)

尝试这样做:

NSString  *tmp = [NSHomeDirectory() stringByAppendingPathComponent:@"tmp"];
NSArray *listOfFiles = [myFileManipulator listFilesForURL:[NSURL fileURLWithPath:tmp]];