/ / Método que retorna objeto com executeFetchRequest - objetivo-c, dados centrais

Método retornando o objeto com executeFetchRequest - objective-c, core-data

Pesquisei nas últimas horas lendo dezenas de postagens sobre o tópico de gerenciamento de memória em objetivo-C e simplesmente não entendi. Desculpe. Estou fazendo o meu melhor!

O que estou procurando no momento é a resposta de como retornar um objeto de um método que chama "executeFetchRequest".

Aqui está algum código ...

+ (Player *)loadPlayerWithPredicate:(NSString *)name:(NSInteger)index
{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Player" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];

// Set filter predicate
NSString *strFilter = [NSString stringWithFormat:@"%@ = %d", name, index];
[request setPredicate:[NSPredicate predicateWithFormat:strFilter]];

// Create the sort descriptors array
NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:name ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sorter]];

NSError *error = nil;
Player *player = nil;
NSArray *array = [managedObjectContext executeFetchRequest:request error:&error];
if ([array count] == 1)
{
player = [array objectAtIndex:0];
//[player retain]; // ???
}

[request release];

return player;
}

Mas o que eu realmente preciso é que o objeto "player" permaneça após o retorno do método.

Como posso deixar o "jogador" vivo após ser devolvido?

Devo chamar "reter"? (e então eu chamaria "liberação" no receptor) Devo "copiar" o objeto?

Eu li todas as outras postagens sobre alocação, cópia, novo, etc.

Eu só preciso de um exemplo simples para que eu possa derivar a compreensão dele. Se você também puder me mostrar um exemplo do receptor chamando esse método, eu ficaria grato.

Obrigado!

Respostas:

1 para resposta № 1

Você poderia usar cópia, mas exigiria que o Player classe está em conformidade com o NSCopying protocolo, o que eu duvido que seja.

A maneira mais simples (e provavelmente a melhor) de fazer isso aqui é:

if ([array count] == 1)
{
player = [[array objectAtIndex:0] retain];
}

[request release];

return [player autorelease];

Você está evitando que o player seja liberado por enquanto, mantendo-o e, quando devolvê-lo, você o usa autorelease. Isso não é estritamente necessário, mas acho que é uma boa prática de programação neste caso. Isso é porque o seu

+ (Player *)loadPlayerWithPredicate:(NSString *)name:(NSInteger)index;

o nome da função implicaria (na prática padrão Obj-C) que o objeto retornado é liberado automaticamente, deixando assim o gerenciamento da memória do objeto para o chamador.

Na aula que você chama + (Player *)loadPlayerWithPredicate:(NSString *)name:(NSInteger)index, você precisará determinar se desejaretenha o Player retornado (como defini-lo como uma propriedade reter) ou se quiser deixá-lo como está (liberado automaticamente e, portanto, provavelmente será liberado após o método em que esta chamada foi concluído. Use isto se precisar apenas execute algumas ações com ele imediatamente e não precise segurá-lo depois).