xcode NSMutableArray 和 NSUserdefaults 问题 iPhone
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9715873/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
NSMutableArray and NSUserdefaults issue iPhone
提问by Omer Waqas Khan
- (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);
}
Using the above code, I am trying to save data dynamically in NSMutableArray and then saving it in NSUserDefaults. But on retrieving it I am getting (null). Even data is not being saved in array.
使用上面的代码,我尝试将数据动态保存在 NSMutableArray 中,然后将其保存在 NSUserDefaults 中。但是在检索它时,我得到了 (null)。甚至数据也没有保存在数组中。
How to save data properly?
如何正确保存数据?
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)
回答by Tirth
Try following code may be help u...
尝试以下代码可能会帮助你...
- (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);
}
回答by Matthias Bauch
no offense, but your code is a big pile of crap.
无意冒犯,但您的代码是一大堆废话。
- variables named
something
are not useful. Period. - you have a variable named something in your local method. And you have a variable named something that is part of your class. The "local variables hides instance variable" warnings are there for a reason!
Probably that is where all your problems come from. I think you don't really understand the concept of local variables. If that is the case you should read more about basic Objective-C stuff. - You check if something is nil and then you don't change something but you allocate an array. Those two have nothing to do with each other. Don't write such code.
- 命名
something
的变量没有用。时期。 - 您在本地方法中有一个名为 something 的变量。并且您有一个名为 something 的变量,它是您的类的一部分。“局部变量隐藏实例变量”警告是有原因的!
可能这就是你所有问题的来源。我认为您并没有真正理解局部变量的概念。如果是这种情况,您应该阅读更多关于基本 Objective-C 的内容。 - 您检查某些内容是否为零,然后您不更改某些内容,而是分配一个数组。这两个人没有任何关系。不要写这样的代码。
I fixed it for you:
我为你修好了:
- (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);
}
However, most likely you want to save objects to the array you got from userDefaults. That won't work with local variables!
但是,您很可能希望将对象保存到从 userDefaults 获得的数组中。这不适用于局部变量!
You would use something like this. But don't copy that verbatim. Try to understand it, and read more about local variables.
你会使用这样的东西。但不要逐字复制。尝试理解它,并阅读有关局部变量的更多信息。
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];
回答by fannheyward
You need to call [[NSUserDefaults standardUserDefaults] synchronize];
after you setObject:forKey
.
你需要[[NSUserDefaults standardUserDefaults] synchronize];
在你之后打电话setObject:forKey
。
[something setObject:array forKey:@"somedata"];
[something synchronize];
回答by Vignesh
add this line ,
添加这一行,
[something synchronize]
before retrieving data.
在检索数据之前。
回答by hchouhan02
try this when you are saving value into NSUserDefaults
当您将值保存到 NSUserDefaults
- (void)savingObject:(NSString *)keyName data:(id)val
{
NSData *dataVal = [NSKeyedArchiver archivedDataWithRootObject:val];
[defaults setObject:dataVal forKey:keyName];
[defaults synchronize];
}
and then when you want to get that use this
然后当你想要使用它时
- (id)gettingObject:(NSString *)keyName
{
NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:keyName];
return [NSKeyedUnarchiver unarchiveObjectWithData:data];
}
i think this helps you
我认为这对你有帮助