MyObject *myObject = [[MyObject alloc] init];NSData *myObjectData = [NSData dataWithBytes:(voID *)&myObject length:sizeof(myObject)];[[NSUserDefaults standardUserDefaults] setobject:myObjectData forKey:@"kMyObjectData"];
用于保存数据,这用于阅读
NSData *getData = [[NSData alloc] initWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"kMyObjectData"]];MyObject *getobject;[getData getBytes:&getobject];
当我在一个VIEwController中保存数据并在其他VIEwController中读取数据时,它的工作非常好.
但是当我想在同一个班级使用它时:
- (IBAction)linkedInLog:(UIbutton *)sender{ NSUserDefaults *myDefaults = [[NSUserDefaults standardUserDefaults] objectForKey:@"linkedinfo"]; NSData *getData = [[NSData alloc] initWithData:myDefaults]; linkedContainer *getobject; [getData getBytes:&getobject]; if (!myDefaults) { mLogInVIEw = [[linkedInLoginVIEw alloc]initWithNibname:@"linkedInLogInVIEw" bundle:nil]; [[NSNotificationCenter defaultCenter] addobserver:self selector:@selector(loginVIEwDIDFinish:) name:@"loginVIEwDIDFinish" object:mLogInVIEw]; [self.navigationController pushVIEwController:mLogInVIEw animated:YES]; if ((FBSession.activeSession.isOpen)&&(mlinkedInIsLogegOn)) { mMergebutton.hIDden = NO; } } else{ mlinkedInIsLogegOn= YES; mlinkedInInfo.mConsumer = getobject.mConsumer; mlinkedInInfo.mToken = getobject.mToken; }}
出了点问题.在@selector:loginVIEwDIDFinish我将我的数据保存到NSUserDefaults:
-(voID) loginVIEwDIDFinish:(NSNotification*)notification{ [[NSNotificationCenter defaultCenter] removeObserver:self]; mlinkedInInfo.mConsumer = mLogInVIEw.consumer; mlinkedInInfo.mToken = mLogInVIEw.accesstoken; NSData *myObjectData = [NSData dataWithBytes:(voID *)&mlinkedInInfo length:sizeof(mlinkedInInfo)]; NSUserDefaults *lSave = [NSUserDefaults standardUserDefaults]; [lSave setobject:myObjectData forKey:@"linkedinfo"]; [lSave synchronize]; if (mlinkedInInfo.mToken) { mlinkedInIsLogegOn = YES; } }
当涉及到其他部分时,程序总是崩溃.如果有人知道我做错了什么请帮助我)
错误消息:编译getobject.Consumer时的线程1:EXC_BAD_ACCESS(代码= 2,地址0x8)
解决方法 在绝大多数情况下,这不是将对象序列化为NSData的有意义的方法:MyObject *myObject = [[MyObject alloc] init];NSData *myObjectData = [NSData dataWithBytes:(voID *)&myObject length:sizeof(myObject)];[[NSUserDefaults standardUserDefaults] setobject:myObjectData forKey:@"kMyObjectData"];
执行此 *** 作的规范方法是MyObject采用NSCoding协议.根据您在此处发布的代码,采用NSCoding可能如下所示:
- (ID)initWithCoder:(NSCoder *)coder{ if (self = [super init]) { mConsumer = [coder decodeObjectForKey: @"consumer"]; mToken = [coder decodeObjectForKey: @"token"]; } return self;}- (voID)encodeWithCoder:(NSCoder *)coder { [coder encodeObject:mConsumer forKey: @"consumer"]; [coder encodeObject:mToken forKey:@"token"];}
一旦完成了这项工作,就可以像这样将MyObject转换为NSData和从NSData转换:
NSData* data = [NSKeyedArchiver archivedDataWithRootObject: myObject];MyObject* myObject = (MyObject*)[NSKeyedUnarchiver unarchiveObjectWithData: data];
你在这里的代码完全是粉碎堆栈并崩溃(因为这行[getData getBytes:& getobject];将导致NSData将字节写入getobject的地址,这是在堆栈上本地声明的.因此堆栈粉碎.)从你的代码开始,一个工作的实现可能看起来像这样:
- (IBAction)linkedInLog:(UIbutton *)sender{ NSData* dataFromDefaults = [[NSUserDefaults standardUserDefaults] objectForKey:@"linkedinfo"]; linkedContainer* getobject = (linkedContainer*)[NSKeyedUnarchiver unarchiveObjectWithData: dataFromDefaults]; if (!dataFromDefaults) { mLogInVIEw = [[linkedInLoginVIEw alloc]initWithNibname:@"linkedInLogInVIEw" bundle:nil]; [[NSNotificationCenter defaultCenter] addobserver:self selector:@selector(loginVIEwDIDFinish:) name:@"loginVIEwDIDFinish" object:mLogInVIEw]; [self.navigationController pushVIEwController:mLogInVIEw animated:YES]; if ((FBSession.activeSession.isOpen)&&(mlinkedInIsLogegOn)) { mMergebutton.hIDden = NO; } } else{ mlinkedInIsLogegOn= YES; mlinkedInInfo.mConsumer = getobject.mConsumer; mlinkedInInfo.mToken = getobject.mToken; }}-(voID) loginVIEwDIDFinish:(NSNotification*)notification{ [[NSNotificationCenter defaultCenter] removeObserver:self]; mlinkedInInfo.mConsumer = mLogInVIEw.consumer; mlinkedInInfo.mToken = mLogInVIEw.accesstoken; NSData* objectData = [NSKeyedArchiver archivedDataWithRootObject: mlinkedInInfo]; [[NSUserDefaults standardUserDefaults] setobject: objectData forKey: @"linkedinfo"]; [[NSUserDefaults standardUserDefaults] synchronize]; if (mlinkedInInfo.mToken) { mlinkedInIsLogegOn = YES; }}总结
以上是内存溢出为你收集整理的ios – 保存自己的数据类型时使用NSUserDefaults全部内容,希望文章能够帮你解决ios – 保存自己的数据类型时使用NSUserDefaults所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)