2010-12-30 17 views
7

Tôi đang gặp sự cố khi tìm ra lý do tại sao NSUserDefaults đang thoát khỏi các tệp tạp chí rác trong Thư viện/Tùy chọn cho ứng dụng của tôi.Tại sao NSUserDefaults để các tệp plist tạm thời trong Thư viện/Tuỳ chọn cho ứng dụng của tôi?

tôi nhìn thấy các tập tin sau đây ...

com.mycompany.myapp.plist 
com.mycompany.myapp.plist.3gaPYul 
com.mycompany.myapp.plist.c97yxEH 

... vv Các plist.* file là 0 byte. Dường như mọi ứng dụng đều chạy, nó để lại một ứng dụng mới. Tôi chắc chắn rằng tôi không gọi -[NSUserDefaults synchronize] ở tất cả, tuy nhiên nếu tôi gọi nó, nó đẩy nhanh sự xuất hiện của tập tin rác cho một lần chạy nhất định. Bước qua trong trình gỡ rối, ngay khi tôi bước qua cuộc gọi để đồng bộ hóa, một tệp mới đã xuất hiện. Nếu tôi đưa ra các cuộc gọi đồng bộ, một tập tin rác mới xuất hiện đôi khi khởi động ứng dụng, thời gian khác trên ứng dụng bỏ thuốc lá.

Tôi cũng đang kiểm tra xem có thể tôi đang đặt người dùng mặc định trên một chuỗi (không, nhưng có khả năng), nghĩ rằng tài liệu nói đó là chuỗi an toàn.

Mọi trợ giúp đều được đánh giá cao. Cảm ơn!

EDIT:

Chỉ cần thấy câu này: "Tại sao?" CFPreferences creates multiple files

khi tôi đồng ý với ý tưởng người trả lời, nó không giải thích phần.

+0

Điều đó thật là điên rồ; cho tôi biết nếu bạn tìm hiểu lý do tại sao! –

+0

Tôi đã có cùng một vấn đề chính xác, với các plists tạm thời thực sự kết thúc làm đầy iPad hoàn toàn (hàng ngàn ~ 4Mb tập tin kết thúc đại diện cho nhiều Gb). Chắc chắn trông giống như một lỗi iOS. – quentinadam

Trả lời

3

Tôi đã bị thuyết phục rằng đây là lỗi của Apple, nhưng tôi không thể tạo ra một mẫu nhỏ minh họa nó. Tôi đã nhận được rất nhiều phản hồi nói rằng các ứng dụng của Apple thực hiện việc này. Kể từ khi tôi đã đánh một bức tường và cần phải tiếp tục di chuyển, tôi đã kết thúc làm một hack khó chịu được hiển thị dưới đây.

@implementation NSUserDefaults(Hack) 

- (BOOL)synchronize 
{ 
BOOL result = CFPreferencesAppSynchronize((CFStringRef)[[NSBundle mainBundle] bundleIdentifier]); 
if (!result) 
{ 
    // there's probably a temp file lingering around... try again. 
    result = CFPreferencesAppSynchronize((CFStringRef)[[NSBundle mainBundle] bundleIdentifier]); 

    // regardless of the result, lets clean up any temp files hanging around.. 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSString *prefsDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Preferences"]; 
    NSDirectoryEnumerator *dirEnumerator = [fileManager enumeratorAtPath:prefsDir]; 
    NSString *file = nil; 
    NSString *match = [[[NSBundle mainBundle] bundleIdentifier] stringByAppendingString:@".plist."]; 
    while ((file = [dirEnumerator nextObject])) 
    { 
     if ([file rangeOfString:match].location != NSNotFound) 
     { 
      NSString *fileToRemove = [prefsDir stringByAppendingPathComponent:file]; 
      [fileManager removeItemAtPath:fileToRemove error:nil]; 
     } 
    } 
} 

return result; 
} 
+1

Tôi đã có cùng một vấn đề chính xác, với các plists tạm thời thực sự kết thúc lên làm đầy iPad hoàn toàn (hàng ngàn ~ 4Mb tập tin kết thúc đại diện cho nhiều Gb). Chắc chắn là một lỗi iOS. – quentinadam

1

Làm các tệp plist này tồn tại giữa các lần khởi chạy ứng dụng? Bạn có lỗi khi lưu trữ tùy chọn không? chính thức của bạn plist đã bật quyền ghi chưa?

Danh sách thuộc tính có thể được viết nguyên tử, có nghĩa là chúng được ghi vào tệp tạm thời và nếu không có lỗi trong quá trình ghi, tệp tạm thời sẽ được đổi tên thành tên tệp ban đầu. Trong những trường hợp bình thường, bạn sẽ không thấy các tệp tạm thời.

+0

Các tệp plist tồn tại giữa các lần khởi chạy. Tôi không thấy bất kỳ lỗi nào khi lưu trữ dữ liệu và quyền ghi là chính xác. Tôi đã nhìn thấy các tập tin tạm thời đến và đi trên các ứng dụng khác (có vẻ bình thường mà họ biến mất). Tôi đã làm điều này trong nhiều năm và đây là lần đầu tiên tôi nhìn thấy hành vi này, vì vậy nó khiến tôi thực sự gãi đầu. Cảm ơn các đề xuất, đã không nghĩ đến việc kiểm tra quyền. – bsneed

1

Tư tưởng - là dữ liệu bạn đang lưu trữ được ghi vào tệp được đặt tên đúng không? Tôi nghĩ rằng bạn ngụ ý rằng nó là. Tôi tự hỏi nếu các tập tin được đặt tên đúng là mở với quyền ghi bằng một cái gì đó khác hơn NSDefaults và nếu đó là ngăn chặn các bản sao lưu an toàn từ giai đoạn tập tin tạm thời?

+0

Chiến lược gỡ lỗi thông thường áp dụng, tất nhiên; sao chép toàn bộ thư mục dự án và bắt đầu đơn giản hóa bằng cách xé từng thứ ra từng chút một và xem khi nào hành vi dừng lại. Làm cho nó đơn giản, đủ và bạn sẽ tìm thấy lỗi của bạn, hoặc có một chương trình trình diễn tốt đẹp cho phóng viên lỗi của Apple: -/ – Dad

+0

Dữ liệu được làm cho nó vào đúng tập tin.Tôi không thấy rằng có bất kỳ mã nào mở một cách rõ ràng tệp đó trong Gity, nhưng tôi sẽ tiếp tục tìm kiếm nó. – bsneed

+0

Bất kỳ cơ hội nào ứng dụng của bạn không chạy vòng lặp chạy bình thường? (giống như vòng lặp chạy theo phương thức hay gì đó). Hoặc hmm, tự hỏi nếu bạn đang cập nhật các giá trị mặc định từ nhiều luồng thực sự thường xuyên và bạn đang nhìn thấy một số loại điều kiện chủng tộc mà điều thứ hai không xảy ra vì đầu tiên là ở giữa xảy ra (hoặc một cái gì đó) ... Có vẻ nhiều hơn giống như một lỗi os tại thời điểm này mặc dù ... – Dad

Các vấn đề liên quan