ios – 保存自己的数据类型时使用NSUserDefaults

ios – 保存自己的数据类型时使用NSUserDefaults,第1张

概述我已经阅读了这个主题 How to save My Data Type in NSUserDefault?并从那里获得了这个有用的代码部分: MyObject *myObject = [[MyObject alloc] init];NSData *myObjectData = [NSData dataWithBytes:(void *)&myObject length:sizeof(myOb 我已经阅读了这个主题 How to save My Data Type in NSUserDefault?并从那里获得了这个有用的代码部分:

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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/web/1056783.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存