2009-04-30 32 views
17

Có ai biết cách nhanh chóng để loại bỏ các tiêu chuẩnUserDefaults của NSUserDefaults thông qua NSLog? Đây là những gì tôi có:NSUserDefaults: Dumping cấu trúc của NSUserDefaults's standardUserDefaults

NSLog(@"NSUserDefaults dump: %@", [NSUserDefaults standardUserDefaults]); 

Nhưng nó sẽ trả về:

NSUserDefaults dump: <NSUserDefaults: 0x50b520> 

... mà không phải là khá những gì tôi đang tìm kiếm. Tôi thực sự muốn có cặp khóa-giá trị.

Bất kỳ trợ giúp hoặc điểm nào đi đúng hướng sẽ được đánh giá cao. Chúc mừng!

Trả lời

18

Nhờ Don McCaughey, đối tác kinh doanh và bạn bè của tôi, vì đã sửa mã của tôi cho tôi và cung cấp câu trả lời ngắn gọn. Để chia sẻ nó với phần còn lại của các bạn ở đây là một đoạn mã:

NSDictionary *bundleInfo = [[NSBundle mainBundle] infoDictionary]; 
    NSString *bundleId = [bundleInfo objectForKey: @"CFBundleIdentifier"]; 

    NSUserDefaults *appUserDefaults = [[NSUserDefaults alloc] init]; 
    NSLog(@"Start dumping userDefaults for %@", bundleId); 
    NSLog(@"userDefaults dump: %@", [appUserDefaults persistentDomainForName: bundleId]); 
    NSLog(@"Finished dumping userDefaults for %@", bundleId); 
    [appUserDefaults release]; 

Như bạn có thể thấy, tất cả những người đã trả lời câu hỏi đã đi đúng hướng, nhưng không có mã số được cung cấp lên là giải pháp - cho đến khi chỉnh sửa của Don mã của chúng tôi trong kiểm soát nguồn. Cảm ơn tất cả!

+0

Vinh quang. Điều này cần phải cao hơn trong danh sách trả lời. –

36
NSLog(@"NSUserDefaults dump: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]); 
+0

@rpetrich: Cảm ơn. Tôi đặt nó vào và nó thực sự đổ kết xuất vào giao diện điều khiển của trình gỡ lỗi, nhưng thông tin đã bị đổ đi trông giống như mặc định của người dùng hệ thống, bao gồm các tùy chọn máy in, prefs múi giờ, ... Bạn có biết cách nào không thế nào để chỉ kéo ra các ứng dụng mặc định của người dùng trên iPhone? Kevin –

+1

NSUserDefault được lưu trữ tại /User/Applications/{UNIQUE_ID}/Library/Preferences/com.yourcompany.yourapp.plist; bạn sẽ có thể lấy đường dẫn đến {UNIQUE_ID} bằng cách truy xuất [[NSBundle mainBundle] bundlePath] và sau đó điều hướng lên một cấp, nhưng tôi không khuyên bạn nên dựa vào tệp đó để ở cùng vị trí giữa các phiên bản hệ điều hành. – rpetrich

+0

@prtrich: Cảm ơn, tôi sẽ xem xét điều đó. (^_^) –

10

Hãy thử:

NSLog(@"NSUserDefaults dump: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]); 

dictionaryRepresentation trả về một đại diện NSDictionary của giá trị mặc định.

+0

@thesamet: Cảm ơn bạn. Nó giống như hai người bạn đang cùng tinh thần phát triển iPhone. (^_^) Vui lòng xem phản hồi của tôi đối với rpetrich. Có thể bạn sẽ có câu trả lời - nhanh hơn. (^_^) Cảm ơn bạn một lần nữa! –

+1

Kiểm tra xem bạn có nhận dạng gói ứng dụng được đặt trong info.plist – thesamet

+0

@thesamet: Cảm ơn, tôi cũng sẽ xem xét điều đó. (^_^) –

6

NSUserDefaults được chia sẻ được khởi tạo với ba tên miền tìm kiếm theo mặc định (bạn cũng có thể thêm các tên khác nếu cần Điều cuối cùng là lý do tại sao bạn nhìn thấy những phím Apple không quen thuộc, nhưng bạn không thực sự phải lo lắng về việc "ghi đè" chúng. Nếu bạn sử dụng cùng một tên khóa, nó sẽ chỉ đặt giá trị đó vào miền tùy chọn ứng dụng. Tùy chọn của ứng dụng của bạn được tìm kiếm trước các tùy chọn hệ thống, do đó bạn sẽ nhận được cùng một giá trị, nhưng nó sẽ không ảnh hưởng đến bất kỳ thứ gì khác.

Nếu bạn thực sự chỉ muốn tùy chọn của ứng dụng, bạn có thể xóa các tên miền tìm kiếm khác (tên cụ thể bạn cần có trong tài liệu).

+0

Xin chào, cảm ơn Marc. Bất kỳ cơ hội nào bạn có thể chỉ cho tôi đúng hướng cách sửa đổi mã: NSLog (@ "NSUserDefaults dump:% @", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]); ... để chỉ tìm kiếm userDefaults của ứng dụng? –

+1

Bạn cần phải loại bỏ các tên miền tìm kiếm khác (tôi nghĩ rằng phương pháp này là một cái gì đó như removeSuiteNamed :?) trước khi gọi dictionaryRepresentation. Tôi không nhớ tên miền, nhưng bạn sẽ tìm thấy chúng trong tài liệu NSUserDefaults. –

8
NSLog(@"%@ defaults = %@", [self class], 
    [[NSUserDefaults standardUserDefaults] 
    persistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]]); 
1

Đây là một lớp tiện dụng mà bạn có thể sử dụng để đổ tất cả các loại tào lao:

https://github.com/VTPG/CommonCode/blob/master/VTPG_Common.h

Để sử dụng nó, thêm tiêu đề để bạn "m"

#import "VTPG_Common.h" 

thì bất cứ nơi nào trong lớp của bạn gọi LOG_EXPR (foo):

NSUserDefaults *userDefaults = [[NSUserDefaults alloc] init]; 
[userDefaults addSuiteNamed:@"com.apple.spaces"]; 
NSDictionary *foo = [userDefaults dictionaryForKey:@"SpacesDisplayConfiguration"]; 
LOG_EXPR(foo); 
Các vấn đề liên quan