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

Objective-C-从自定义实例返回NSArray方法返回nil,objective-c,class,return,return-value,Objective C,Class,Return,Return Value,我一直在绞尽脑汁想为什么我会得到这样的结果,但是人们会注意到我是一个objc开发的初学者 忽略我尝试做的事情有不同的方式(例如扩展NSFileManager),如果不是太多的业余错误,我希望能得到一些信息 如果在返回实例方法listFilesForURL的过程中中断,则返回的NSArray对象“theFiles”很好。我得到了我期望的结果,但是在main.c中,“listOfFiles”总是为零 有人能指出我看不到的东西吗?非常感谢您的任何意见 main.c #import <Founda

我一直在绞尽脑汁想为什么我会得到这样的结果,但是人们会注意到我是一个objc开发的初学者

忽略我尝试做的事情有不同的方式(例如扩展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;
}
尝试这样做:

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

我认为这可能失败的原因有两个:

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

  • 不管有无ARC,任何你不使用的东西都会丢失——这是内存管理方面的明智之举。忽略main包含未引用的变量这一事实,当到达
    @autoreleasepool
    块的末尾时,其中的任何内容都应该是死的(因为它非常接近于
    return
    语句。具有任何类型运行循环的应用程序中涉及的自动释放池都不能保证对象的生命周期)。这意味着您应该在调用该方法后立即进行日志记录,以便在释放该方法之前至少能够获得可靠的立足点


  • 是否使用ARC(自动参考计数)?如果没有,请尝试添加对文件的retain调用。打印传入listFilesForURL的NSURL。确保它不是零。通过listFilesError返回什么?始终检查您的NSError out参数。#2成功了……我一直在尝试破坏编译器并检查两边的NSArray,但正如您所说的,因为我没有在mai中使用它n、 c,它被解除分配了。当我添加了一个NSLog来计算数组的大小时,该对象包含了数组。非常感谢您的反馈!
    #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
    
    NSString  *tmp = [NSHomeDirectory() stringByAppendingPathComponent:@"tmp"];
    NSArray *listOfFiles = [myFileManipulator listFilesForURL:[NSURL fileURLWithPath:tmp]];