Pergunta

Estou tendo problemas definição de um modelo de objeto para salvar o estado visual da CALayers gerados por usuários em um aplicativo gráfico simples para o iphone.

Eu estou tentando salvar a cor de fundo e quadro de todas as camadas atuais na tela passando essas propriedades para objetos de modelo que implementam o protocolo NSCoding e, em seguida, em um NSMutableArray que o delegado aplicativo possui. Então eu arquivar a matriz com NSKeyedArchiver e armazená-lo nas NSUserDefaults.

propriedade backgroundColor de cada CALayer é convertido para um UIColor a ser codificada pelo modelo de objeto para armazenamento. Eu acho que eu estou desarmazenando a matriz incorretamente ou não a restauração do estado da matriz unarchived corretamente. Quando tento acessar o objeto UIColor que era loja no modelo de objeto, eu recebo um EXC_BAD_ACCESS.

Eu pensei que era possivelmente um bug com a codificação UIColor objetos tão tentou puxar os valores para fora do CGColorRef com as CGColorGetComponents funcionar e armazená-los em uma matriz para codificar e do arquivo, mas eu tive o mesmo resultado do acesso ruim depois desarmazenando, então eu acho que eu só estou fazendo errado.

Este é o meu objeto de modelo:

@interface AILayerData : NSObject <NSCoding> {

    UIColor*    color;
    CGRect      frame;
}

@property (retain) UIColor* color;
@property (assign) CGRect   frame;

@end


@implementation AILayerData

@synthesize color;
@synthesize frame;

- (void)encodeWithCoder:(NSCoder *)coder; 
{
    [coder encodeObject:color forKey:@"color"];
    [coder encodeCGRect:frame forKey:@"frame"];
}


- (id)initWithCoder:(NSCoder *)coder;
{
    self = [[AILayerData alloc] init];
    if (self != nil)
    {
        color = [coder decodeObjectForKey:@"color"];
        frame = [coder decodeCGRectForKey:@"frame"];
    }
    return self;
}

@end

E esta é minha implementação arquivamento:

@implementation AppDelegate

- (void)applicationWillTerminate:(UIApplication *)application {

    NSArray *layersArray = viewController.view.layer.sublayers;

    dataArray = [NSMutableArray array]; 

    for(AILayer *layer in layersArray)
    {
        AILayerData *layerData = [[AILayerData alloc] init];

        layerData.frame = layer.frame;

        UIColor *layerColor = [UIColor colorWithCGColor:layer.backgroundColor];

        layerData.color = layerColor;               

        [dataArray addObject:layerData];

        [layerData release];

    }

    [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:layerDataArray] forKey:@"savedArray"];
}

@end

E aqui é onde eu restaurar o estado:

@implementation ViewController

- (void)viewDidLoad 
{    
    [super viewDidLoad];

    spaceView = [[AISpaceView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.view = spaceView;

    [spaceView release];

    spaceView.delegate = self;

    NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];

    NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"savedArray"];

    if (dataRepresentingSavedArray != nil) {

        [self restoreStateWithData:dataRepresentingSavedArray];

    }
}

- (void)restoreStateWithData:(NSData *)data 
{   
    NSArray *savedLayers = [NSKeyedUnarchiver unarchiveObjectWithData:data];

    if (savedLayers != nil) {

        NSArray *restoredLayers = [[NSArray alloc] initWithArray:savedLayers];

        for(AILayerData *layerDataObject in restoredLayers) {                       

            UIColor *layerColor = layerDataObject.color;

            AILayer *newLayer = [[AILayer alloc] init];         

            newLayer.backgroundColor = layerColor.CGColor;

            newLayer.frame = layerDataObject.frame;         

            newLayer.isSelected = NO;

            [self.view.layer addSublayer:newLayer];

            [newLayer release];                                 
        }

        [restoredLayers release];

        [spaceView.layer layoutSublayers];      
    }
}

@end

Qualquer ajuda com isso é muito apreciada. Eu sou praticamente um noob. Eu estava codificação, arquivamento e unarching um NSArray de NSNumbers convertido de carros alegóricos da cor em praticamente da mesma maneira e ter acesso ruim.

Foi útil?

Solução

Você certamente quer manter a cor em initWithCoder:

color = [[coder decodeObjectForKey:@"color"] retain];

ou, com a sintaxe de ponto como a cor foi declarado como um manter propriedade:

self.color = [coder decodeObjectForKey:@"color"];

Outras dicas

Você está layerColor sobre liberador:. Você não o possui (layerDataObject faz), mas você está liberando-lo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top