2011-07-13 8 views
10

Tôi đang xây dựng một ứng dụng lưu trữ hình ảnh trong thư mục Tài liệu của gói ứng dụng. Để đảm bảo rằng các thư mục tồn tại, tôi muốn kiểm tra xem chúng có tồn tại hay không và nếu chúng không tồn tại, hãy tạo chúng tại thời điểm bắt đầu ứng dụng.Làm cách nào để tránh EXC_BAD_ACCESS khi kiểm tra xem các thư mục có tồn tại không?

Hiện nay, tôi đang làm điều này trong didFinishLaunchingWithOptions: như vậy:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    NSArray *directoriesToCreate = [[NSArray alloc] initWithObjects: 
            @"DirA/DirA1", 
            @"DirA/DirA2", 
            @"DirB/DirB2", 
            @"DirB/DirB2", 
            @"DirC", 
            nil]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsPath = [paths objectAtIndex:0]; 

    for (NSString *directoryToCreate in directoriesToCreate) { 

     NSString *directoryPath = [documentsPath stringByAppendingPathComponent:directoryToCreate]; 
     NSLog(directoryPath); 
     if (![[NSFileManager defaultManager] fileExistsAtPath:directoryPath isDirectory:YES]) { 

      NSError *directoryCreateError = nil; 
      [[NSFileManager defaultManager] createDirectoryAtPath:directoryPath 
             withIntermediateDirectories:YES 
                 attributes:nil 
                  error:&directoryCreateError]; 


     } 

    } 

    [window addSubview:navigationController.view]; 
    [window makeKeyAndVisible]; 

    return YES; 

} 

Trên đường chạy trốn đầu tiên của ứng dụng - khi không ai trong số các thư mục tồn tại - ứng dụng chạy, các thư mục được tạo ra như mong đợi và mọi thứ chỉ chạy tốt.

Khi ứng dụng bị chấm dứt và chạy lại, tôi nhận được tín hiệu EXC_BAD_ACCESS trên cuộc gọi fileExistsAtPath: trên [NSFileManager defaultManager].

Điều tôi không hiểu là lý do tại sao điều này chỉ chạy tốt khi các thư mục không tồn tại, nhưng nó sẽ sụp đổ khi chúng tồn tại.

Có ai có thể cung cấp bất kỳ trợ giúp nào không?

+0

NSLog của bạn sẽ giống như, "NSLog (@"% @ ", anObject);'. Chỉ định 'NSLog (anObject);' hoạt động nếu * anObject * là một chuỗi, bởi vì chuỗi định dạng phải được đặt ở vị trí đó. Vì vậy, nó sẽ lấy * anObject * làm chuỗi định dạng. Nhưng nó sẽ sụp đổ nó là một số đối tượng khác hơn là một chuỗi. – EmptyStack

+0

Cố gắng 'giữ lại' '' và 'đối tượng documentsPath' và' release' chúng sau chu kỳ 'for'. – jamapag

Trả lời

40

Bạn đang sử dụng chức năng kiểm tra sai cách. tham số thứ 2 phải là một con trỏ đến một biến boolean đó sẽ được lấp đầy sau khi hàm được gọi:

Bạn đang sử dụng chức năng như thế này:

[[NSFileManager defaultManager] fileExistsAtPath:directoryPath isDirectory:YES]; 

Nhưng chức năng nên được sử dụng như thế này:

BOOL isDir; 
[[NSFileManager defaultManager] fileExistsAtPath:directoryPath isDirectory:&isDir]; 

if (isDir) { // file exists and it is directory. 
+0

Điều này giải thích tại sao sử dụng hàm không có tham số 'isDirectory' hoạt động - cảm ơn vì đã giải thích lý do. – abitgone

+0

+1 Và tôi thực sự ghét nó mà mọi người không quan tâm đến cảnh báo trình biên dịch. Nó chỉ trực tiếp vào vấn đề. – Eiko

+0

Tôi quan tâm đến cảnh báo trình biên dịch - nó chỉ là, trong những giai đoạn đầu tiên của việc mày mò với iOS, tôi không thường hiểu ý của chúng. – abitgone

4

isDirectory là (BOOL *) để trả về mô tả boolean nếu đường dẫn trỏ vào một thư mục. Bạn đang đi qua một BOOL.

Lý do không bị lỗi nếu thư mục tồn tại là giá trị không được đặt nếu thư mục không tồn tại.

+0

Thay đổi 'fileExistsAtPath: directoryPath làDirectory: YES' thành' fileExistsAtPath: directoryPath' dường như giải quyết vấn đề. Cảm ơn! – abitgone