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;
}
答案 0 :(得分:1)
您是否真的将该ivar设置为默认对象?
name = [NSUserDefaults standardUserDefaults];
您通常会在init方法中执行此类操作。
我猜这是因为在ObjectiveC中,nil可以有调用它的方法,所有返回的都是nil。因此,如果name
为nil,那么它将无声地保存,然后在您尝试将其读回时调用return nil。
答案 1 :(得分:0)
与大多数对象不同,UIViewController
的指定初始值设定项不是init
。我现在看到你确实说过这是一个ViewController,抱歉我以前错过了它。 UIViewController
的指定初始值设定项为initWithCoder
或initWithFrame
,其中一个将被调用进行初始化。这导致了问题,'我在哪里放置我的设置代码',这在之前已经讨论过。
事实上我敢打赌,如果你将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.
}