У меня проблема в обычно очень простом квесте, я хочу создать собственный класс, содержащий целое число, 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
My ViewController содержит две кнопки с именами Create и Read, а также UILabel с именем label.
#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, либо она отображается правильно в первый раз и вылетает при повторном выполнении, снова с той же ошибкой.
Что я делаю не так?