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 № 1Você 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).