NSUserDefaults用于自创类

时间:2011-05-13 20:20:44

标签: objective-c cocoa-touch nsuserdefaults

我在一个非常简单的任务中遇到问题,我想创建一个包含整数,NSString和NSDate的自定义类。但是,在我的示例中,我只使用NSString来显示存储对象时的问题。

这是我的班级标题:     #import

@interface MyClass : NSObject <NSCoding> {
    NSString * myString;
}
@property (retain) NSString * myString;
@end

和我的身体:

#import "MyClass.h"

@implementation MyClass
@synthesize myString;

- (id)initWithCoder:(NSCoder *)coder {
    self = [super init];
    if (self) {
        myString = [coder decodeObjectForKey:@"myString"];
    }
    return self;
}
- (id)init {
    self = [super init];
    if (self) {
        myString = @"Hi";
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject: myString forKey:@"myString"];
}

- (void)dealloc {
    myString = nil;
    [super dealloc];
}
@end

我的ViewController包含两个名为Create和Read的按钮,以及一个名为UILabel的标签。

#import <UIKit/UIKit.h>
@interface UserDefaultsTestViewController : UIViewController {

    IBOutlet UILabel *label;
}
- (IBAction)pushCreate;
- (IBAction)pushLoad;
@end

我只会展示我在这里编辑的功能:

#import "UserDefaultsTestViewController.h"
#import "MyClass.h"
- (IBAction)pushCreate {
    MyClass * myClass = [[MyClass alloc] init];
    NSData * data = [NSKeyedArchiver archivedDataWithRootObject:myClass];
    NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:data forKey:@"Test"];
    [myClass release];
}

- (IBAction)pushLoad {
    NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
    NSData * atchive = [defaults objectForKey:@"Test"];
    MyClass * myClass = [NSKeyedUnarchiver unarchiveObjectWithData:atchive];
    label.text = myClass.myString;
}

但是,如果我运行我的代码,我会收到一个EXC_BAD_ACCESS错误或第一次正确显示它并在第二次执行时崩溃,再次出现相同的错误。 我做错了什么?

1 个答案:

答案 0 :(得分:1)

你想这样做:

self.myString = @"Hi";

或者:

myString = @"Hi";
[myString retain];

同样,你的dealloc应该有:

self.myString = nil;

[myString release];