2011-07-21 10 views
0

私の悪い英語のために申し訳ありませんが、私は最高の言葉で説明しようとしています。NSMutableArray in NSUserDefaults

私はNSUserDefaultsでNSMutableArrayの([NSUserDefaults setObject:forKey:]:非プロパティ値「を挿入しようとする)を挿入しようとしているときに私はいくつかの問題を抱えている

次のように配列を挿入するための私のコードは次のとおりです。

-(void)saveToUserDefaults:(NSMutableArray*)myArray 
{ 
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
    NSArray *array = [[NSArray alloc ] initWithArray:myArray]; 

    if (standardUserDefaults) 
     { 
      [standardUserDefaults setObject:array forKey:@"MyArray"]; 
      [standardUserDefaults synchronize]; 
     } 

} 

-(NSMutableArray*)retrieveFromUserDefaults 
{ 
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
    NSMutableArray *val = [[NSMutableArray alloc]init]; 

    if (standardUserDefaults) 
      val = [NSMutableArray arrayWithArray:[standardUserDefaults arrayForKey:@"MyArray"]]; 

    return val; 

}

私のコードでは、配列を取得するには0

と私のコードで:

NSMutableArrayの:

series = [[NSMutableArray alloc]initWithObjects:nil]; 
//add some object inf my array... 

私NSMutableArrayのを保存します。

[self saveToUserDefaults:series]; 

を取得し、私NSMutableArrayの:

series = [self retrieveFromUserDefaults]; 

私はそれがための最良の方法はないと思いますそうすれば誰もがアイディアを持っていれば、それは私のために役立つだろう。

読んでいただきありがとうございます。

トミー

+0

私は完全な実装コード – jkk

答えて

8

のみ不変NSArray sがデフォルトに入れることができます。そこにNSMutableArrayを配置するのではなく、[NSArray arrayWithArray:]を使用して通常の配列に変換し、その配列をデフォルトに配置します。

検索には、NSArrayを取得してから[NSMutableArray arrayWithArray:]を使用します。

+0

を持つことができ、私はNSArrayの*配列= [[NSArrayのアロケーション] arrayWithArray:MyArrayという]を行うことはできません。 –

+0

@tommy 'arrayWithArray'はクラスメソッドです。最初にallocを呼び出さないでください。 '[NSArray arrayWithArray:myArray]' – highlycaffeinated

+0

@tommy:それは '' [[NSArray alloc] initWithArray:myArray] 'です。 2つの方法は同等ではありません。前者は自動解放されたオブジェクトを生成し、後者は後で '解放 'する必要があります。 –

0

あなたの配列の内容ができる唯一のplist有効なオブジェクトによって:(NSStringNSNumberNSDateNSDataNSArray、またはNSDictionaryオブジェクト)。 NSUserDefaultssetObject:forKey:What is a Property List?

0

ため

参照文書は、あなたは不変から変更可能なオブジェクトを取得するには、次の方法を使用することができます。最適化されておらず、NSArrayとNSDictionaryに対してのみ実装されています。

+ (id) GetMutable:(id)input { 
    id result; 
    if ([input superclass] == [NSArray class] || [input superclass] == [NSMutableArray class]) { 
     result = [[NSMutableArray alloc] initWithArray:input copyItems:YES]; 

     for (int i = 0; i < [(NSMutableArray*)result count]; i++) { 
      [(NSMutableArray*)result replaceObjectAtIndex:i withObject:[Globals GetMutable:[(NSMutableArray*)result objectAtIndex:i]]]; 
     } 
    } else if ([input superclass] == [NSDictionary class] || [input superclass] == [NSMutableDictionary class]) { 
     result = [[NSMutableDictionary alloc] initWithDictionary:input copyItems:YES]; 

     NSArray *keys=[(NSMutableDictionary*)result allKeys]; 

     for (int i = 0; i < keys.count; i++) { 
      [(NSMutableDictionary*)result setObject:[Globals GetMutable:[(NSMutableDictionary*)result objectForKey:[keys objectAtIndex:i]]] forKey:[keys objectAtIndex:i]]; 
     } 

    } 
    else { 
     return input; 
    } 
    return result; 
} 
0

this私はこのチュートリアルの回答を期待しています。

-(void)saveToUserDefaults:(NSString*)myServerName uname:(NSString*)myUserName 
    pass:(NSString*)myPassword 
    { 
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 

    if (standardUserDefaults) { 
    [standardUserDefaults setObject:myServerName forKey:@"ServerKey"]; 
    [standardUserDefaults setObject:myUserName forKey:@"UserNameKey"]; 
    [standardUserDefaults setObject:myPassword forKey:@"PasswordKey"]; 
    [standardUserDefaults synchronize]; 
    } 
} 
-(NSArray*)retrieveFromUserDefaults 
{ 
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
    NSString *serverName = nil; 
    NSString *userName = nil; 
    NSString *password = nil; 
    if (standardUserDefaults) 
    serverName = [standardUserDefaults objectForKey:@"ServerKey"]; 
    userName = [standardUserDefaults objectForKey:@"UserNameKey"]; 
    password = [standardUserDefaults objectForKey:@"PasswordKey"]; 

    NSArray* credentials = [NSArray arrayWithObjects:serverName,userName,password, nil]; 
    return credentials; 
} 

渡す値

[self saveToUserDefaults:serverVariable uname:usernameVariable pass:passVariable]; 

は値

NSArray *result=[self retrieveFromUserDefaults]; 

コーディングハッピーを取得するには!

0

コードをクリーンアップする必要があります。ここでは、標準ユーザデフォルトにアクセスするためのシンプルかつ正しい方法は次のとおりです。

  1. それができるが、あなたの保存方法に渡す値は、可変である必要はありません。しかし、あなたの方法の中でそれを突然変異させているわけではないので、それが変更可能である必要はありません。 ; [NSUserDefaults standardUserDefaults] =(NSArrayの*)myarrayの { 場合(MyArrayという){ NSUserDefaults * myDefaults: - (無効)saveToUserDefaults

    :それはちょうどあなたが保存する前に確認してくださいよこれ、nilでないことがあります myDefaults [@ "myArray"] = myArray; } }

  2. 標準ユーザデフォルトにだけが "mutableCopy" メソッドを使用して変更可能なコピーへ変換することができ、非可変オブジェクト、戻り:

    - (NSMutableArrayの*)retrieveFromUserDefaults { NSUserDefaults * myDefaultsを= [NSUserDefaults standardUserDefaults]; NSMutableArray * val = [[NSMutableArray alloc] init]; val = [myDefaults [@ "MyArray"] mutableCopy]; return val; }

+0

不正なコードブロックのフォーマットにお詫びします。 ctrl-K、cmd-K、{}のいずれも私のために働いていません。 –