2012-03-15 85 views
0
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    NSUserDefaults *somet = [NSUserDefaults standardUserDefaults]; 

    NSMutableArray *anArr = [somet objectForKey:@"somedata"] ; 

    NSLog(@"anArr::: %@",anArr); 

} 

-(IBAction)addsomething:(id)sender{ 

    if (something == nil) { 
     array = [[NSMutableArray alloc] init]; 
    } 
    NSLog(@"textfieldvalue::: %@", textfield.text); 

    [array addObject:textfield.text]; 

    NSUserDefaults *something = [NSUserDefaults standardUserDefaults]; 

    [something setObject:array forKey:@"somedata"]; 

    array = [something objectForKey:@"somedata"]; 

    NSLog(@"array:: %@", array); 

} 

使用上面的代碼,我試圖在NSMutableArray中動態保存數據,然後將它保存在NSUserDefaults中。但在檢索它時,我得到(null)。即使數據沒有被保存在數組中。NSMutableArray和NSUserdefaults問題iPhone

如何正確保存數據?

EDITED: 

2012-03-15 15:17:18.431 check[2686:40b] anArr::: (null) 
2012-03-15 15:17:30.160 check[2686:40b] textfieldvalue::: a 
2012-03-15 15:17:30.162 check[2686:40b] array::: (null) 
+0

你在哪裏初始化'array'?此外,'objectForKey:'不會返回一個可變數組實例('NSMutableArray')。 – 2012-03-15 08:05:14

+0

請檢查我編輯了我的問題 – 2012-03-15 08:07:07

+0

現在它更令人困惑。爲什麼要檢查'無'的東西?它還沒有初始化。 – 2012-03-15 08:10:34

回答

3

沒有違法,但你的代碼是一堆廢話。

  1. 變量名爲something沒有用。期。
  2. 你有一個變量在你的本地方法中名爲something。你有一個變量,它是你類的一部分。 「局部變量隱藏實例變量」警告是有原因的!
    也許這就是你所有的問題來自哪裏。我認爲你不太瞭解局部變量的概念。如果是這種情況,你應該閱讀更多關於基本Objective-C的東西。
  3. 你檢查是否有零,然後你不改變的東西,但你分配一個數組。這兩者沒有任何關係。不要寫這樣的代碼。

我固定它給你:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    NSArray *anArr = [userDefaults objectForKey:@"somedata"]; 
    NSLog(@"anArr::: %@",anArr); 
} 

-(IBAction)addsomething:(id)sender{ 
    NSMutableArray *array = [[NSMutableArray alloc] init]; 
    NSLog(@"textfieldvalue::: %@", textfield.text); 
    [array addObject:textfield.text]; 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    [userDefaults setObject:array forKey:@"somedata"]; 
    array = [userDefaults objectForKey:@"somedata"]; 

    // synchronize is only needed while debugging (when you use the stop button in Xcode) 
    // you don't need this in production code. remove it for release 
    [userDefaults synchronize]; 

    NSLog(@"array:: %@", array); 
} 

然而,很可能要對象保存到你userDefaults得到了數組。這不適用於局部變量!

你會使用這樣的東西。但不要複製這些逐字。嘗試瞭解它,並閱讀更多關於局部變量。

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
array = [[userDefaults objectForKey:@"somedata"] mutableCopy]; 
if (!array) { 
    // create array if it doesn't exist in NSUserDefaults 
    array = [[NSMutableArray alloc] init]; 
} 
NSLog(@"array in viewDidLoad: %@",array); 



NSLog(@"textfieldvalue::: %@", textField.text); 
[array addObject: textField.text]; 
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
[userDefaults setObject:array forKey:@"somedata"]; 

// synchronize is only needed while debugging (when you use the stop button in Xcode) 
// you don't need this in production code. remove it for release 
[userDefaults synchronize]; 
+0

非常感謝你,已經試過你的代碼,但我得到這個結果 2012-03-15 15:51:36.832 check [3025:40b] textfieldvalue ::: a 2012-03-15 15:51:36.845 check [3025:40b] array ::(a) 2012-03-15 15:51:44.712 check [3025:40b] textfieldvalue ::: b 2012-03-15 15:51:44.738 check [3025:40b ] array ::(b) – 2012-03-15 10:54:03

+0

它將用新的元素替換之前的元素,而不是添加新元素。就像插入「a」那麼數組是array ::(a)然後在輸入b之後,數組應該是數組::(a,b),但是它給出array ::(b) – 2012-03-15 10:56:28

+2

我的答案的代碼塊,並嘗試瞭解它的功能。它應該做到這一點。請記住:array是一個實例變量,而不是局部變量。 – 2012-03-15 10:59:36

3

嘗試下面的代碼可能會幫助ü...

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 

NSUserDefaults *somet = [NSUserDefaults standardUserDefaults]; 

NSMutableArray *anArr = [[NSMutableArray alloc] init]; 
anArr = [somet objectForKey:@"somedata"] ; 
[somet synchronize]; 

NSLog(@"anArr::: %@",anArr); 

} 

-(IBAction)addsomething:(id)sender{ 

NSLog(@"textfieldvalue::: %@", textfield.text); 
//Here u have to check array is in memory allocate or not 
[array addObject:textfield.text]; 

NSUserDefaults *something = [NSUserDefaults standardUserDefaults]; 

[something setObject:array forKey:@"somedata"]; 
[something synchronize]; 

array = [something objectForKey:@"somedata"]; 

NSLog(@"array:: %@", array); 

} 
+0

你正在分配一個nsmutable數組,然後分配一個對象,沒有意義 – 2012-03-15 08:18:44

+0

仍然是相同的結果,在NSLog(@「array ::%@」,array);它說(nul) – 2012-03-15 08:22:08

+0

問題現在被編輯 – 2012-03-15 10:20:57

2

您需要在您setObject:forKey調用[[NSUserDefaults standardUserDefaults] synchronize];

[something setObject:array forKey:@"somedata"]; 
[something synchronize]; 
+0

試過了,但仍然是數組null::( – 2012-03-15 08:42:16

0

加入這一行,

[something synchronize] 

檢索數據之前。

+0

抱歉,你現在是我關於同步戀物癖的咆哮的目標,'同步'通常是沒有必要的!你強制NSUserDefaults將整個設置文件寫入文件系統,Apple實現了NSUserDefaults,以便它知道什麼時候需要寫入它的設置(例如,當應用程序進入後臺或退出時),'synchronize'在調試時可能沒有問題,當你偶爾用Xcode停止按鈕強制停止應用程序時,但是經驗表明,這樣的代碼從未被刪除,因爲它「有效」 – 2012-03-15 10:55:59

+0

**結論:不要在每次調用後放置一個[userDefaults synchronize]這改變了NSUserDefaults。** NSUserDefaults是聰明的!它被緩存在內存中,並且只在必要時寫入磁盤。 – 2012-03-15 10:56:54

+0

@MatthiasBauch。Very Insight首先感謝您的評論。我解決了同步問題,但沒有意識到它很重。我會牢記這一點。 – Vignesh 2012-03-15 11:47:57

0

試試這個當您保存價值爲NSUserDefaults

- (void)savingObject:(NSString *)keyName data:(id)val 
{ 
    NSData *dataVal = [NSKeyedArchiver archivedDataWithRootObject:val]; 
    [defaults setObject:dataVal forKey:keyName]; 
    [defaults synchronize]; 
} 

,然後當你想要得到的是使用這種

- (id)gettingObject:(NSString *)keyName 
{ 
    NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:keyName]; 
    return [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
} 

我認爲這可以幫助你

+0

不需要爲保存NSString(如textField.text)這樣做。 NSStrings是一個plist風格的屬性,可以直接保存到NSUserDefaults – 2012-03-15 10:50:36

+0

是的,我知道,但他正在'NSUserDefaults'添加'NSMutableArray',所以建議他這樣做。 – hchouhan02 2012-03-15 12:25:21