为什么这不能保存?

时间:2011-11-19 08:31:31

标签: objective-c ios nsstring nsuserdefaults

NSString *senderName = [sender currentTitle];
NSLog(@"Text to be Saved = %@",senderName);
[name setObject:senderName forKey:@"key"];
NSString *TextActuallySaved = [name stringForKey:@"key"];
NSLog(@"Text actually Saved = %@", TextActuallySaved);

所以我有这个代码,当我运行它时,我在控制台中得到它:

appName[19556:f803] Text to be Saved = SCV
appName[19556:f803] Text actually Saved = (null)

那么,我做错了什么?我在@interface的标题中声明了一个NSUserDefault对象,如下所示:

@interface viewController : UIViewController  {
NSUserDefaults *name;
}

所有这些代码都在ViewController中,因为它被推送。那是为什么呢?如果有的话有办法解决这个问题吗? 这严重困扰着我。任何帮助将非常感激。谢谢!

这是我的初始代码

- (id)init {
if (self = [super init])
{
    name = [NSUserDefaults standardUserDefaults];
}
return self;
}

2 个答案:

答案 0 :(得分:1)

您是否真的将该ivar设置为默认对象?

name = [NSUserDefaults standardUserDefaults];

您通常会在init方法中执行此类操作。


我猜这是因为在ObjectiveC中,nil可以有调用它的方法,所有返回的都是nil。因此,如果name为nil,那么它将无声地保存,然后在您尝试将其读回时调用return nil。

答案 1 :(得分:0)

与大多数对象不同,UIViewController的指定初始值设定项不是init。我现在看到你确实说过这是一个ViewController,抱歉我以前错过了它。 UIViewController的指定初始值设定项为initWithCoderinitWithFrame,其中一个将被调用进行初始化。这导致了问题,'我在哪里放置我的设置代码',这在之前已经讨论过。

事实上我敢打赌,如果你将NSLog(@"Init");放在init方法中,你会发现它从未被调用过。因此,它永远不会分配您的ivar

为简单起见,如果你是UIViewController的子类并希望进行初始化而不必在init方法中,则使用viewDidLoad

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