Question

J'ai 3 méthodes une qui obtient une couleur et l'enregistre comme un objet de données dans les paramètres des paramètres de l'utilisateur, qui dessine un rectangle et le remplit avec la couleur enregistrée dans les paramètres des utilisateurs et une méthode qui initialise et l'instance de NSColor avec la couleur enregistrée dans l'utilisateur par défaut lorsque l'application se lance.

Voici les 3 méthodes, mais le problème est que j'obtiens cette erreur lorsque je construis et exécute l'application, quelqu'un peut comprendre pourquoi j'obtiens cette erreur et ce qui ne va pas avec mon code.

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;
}
Était-ce utile?

La solution

Le problème est dans votre initWithFrame: méthode. _color est défini avec [NSColor blackColor] ou [NSUnarchiver unarchiveObjectWithData:data]. Ces deux méthodes renvoient des objets auto-élégants. Vous devez les conserver pour vous assurer qu'ils existent encore quand drawRect: est appelé. Le moyen le plus simple serait d'appeler [_color retain] Après le Unarchive, de sorte que le Blackcolor sera toujours en autoréation s'il est remplacé.

Assurez-vous également de libérer l'ancien _Color dans setColor:. À l'heure actuelle, il divulgue un objet NSColor à chaque fois qu'il est appelé.

Autres conseils

C'est votre problème, je pense:

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

Vous ne possédez pas l'objet renvoyé par unarchiveObjectWithData: Mais vous l'affectez à une variable d'instance et le traitez comme s'il vous appartenait. Vous pouvez explicitement prendre possession de l'objet comme vous le faites dans votre secteur, en utilisant le copy méthode:

_color = [color1 copy];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top