NSColor и NSUserDefaults вызывают;Программа получила сигнал: «EXC_BAD_ACCESS» - PullRequest
0 голосов
/ 17 февраля 2011

У меня есть 3 метода, один из которых получает цвет и сохраняет его как объект данных в пользовательских значениях по умолчанию, второй рисует прямоугольник и заполняет его цветом, сохраненным в пользовательских значениях по умолчанию, и один метод инициализирует и экземпляр NSColor цветом сохраняется в пользовательских настройках по умолчанию при запуске приложения.

Ниже приведены 3 метода, однако проблема в том, что я получаю эту ошибку при сборке и запуске приложения, может кто-нибудь понять, почему я получаю эту ошибку и что не так с моим кодом.

Program received signal: “EXC_BAD_ACCESS”.

- (void)setColor:(NSColor *)color
{
    _color = [color copy];

    NSData *data = [NSArchiver archivedDataWithRootObject:_color];
    [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"MyColor"];

    [self setNeedsDisplay:YES];
}


    - (void)drawRect:(NSRect)rect 
{

     NSRect rect1 = NSInsetRect([self bounds], 4.0, 4.0);
     NSBezierPath * path;
     [_color set];
     path = [NSBezierPath bezierPathWithRoundedRect:rect1
                                                   xRadius:6.0
                                                   yRadius:6.0];
     [path fill];
}

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self == nil)
        return nil;

    _color = [NSColor blackColor];
    NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"MyColor"];
    if (data != nil){
    NSColor *color1 = [NSUnarchiver unarchiveObjectWithData:data];
    _color = color1;}

    return self;
}

Ответы [ 2 ]

4 голосов
/ 17 февраля 2011

Проблема в вашем initWithFrame: методе. _color устанавливается либо с [NSColor blackColor], либо с [NSUnarchiver unarchiveObjectWithData:data]. Оба эти метода возвращают объекты с автоматическим освобождением. Вам нужно сохранить их, чтобы убедиться, что они все еще существуют, когда вызывается drawRect:. Самым простым способом было бы вызвать [_color retain] после разархивирования, чтобы blackColor по-прежнему автоматически высвобождался, если его заменяли.

Кроме того, убедитесь, что вы выпустили старый _color в setColor:. Прямо сейчас он пропускает объект NSColor каждый раз, когда он вызывается.

1 голос
/ 17 февраля 2011

Это ваша проблема, я думаю:

NSColor *color1 = [NSUnarchiver unarchiveObjectWithData:data];
_color = color1;

Вы не являетесь владельцем объекта, возвращенного unarchiveObjectWithData:, но присваиваете его переменной экземпляра и рассматриваете его как принадлежащий вам,Вы можете явно стать владельцем объекта точно так же, как вы делаете это в своем установщике, используя метод copy:

_color = [color1 copy];
...