NSUserDefaults для самостоятельно созданных классов - PullRequest
0 голосов
/ 14 мая 2011

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

1 Ответ

1 голос
/ 14 мая 2011

Вы хотите сделать:

self.myString = @"Hi";

Или:

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

Аналогично, ваш диллок должен иметь:

self.myString = nil;

или

[myString release];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...