2011-08-26 7 views
9

Ho alcune funzionalità dei dati principali che funzionavano correttamente fino a quando non sono state apportate alcune modifiche recenti (apparentemente non correlate). Ora ho problemi con tutti gli attributi che appartengono ad una particolare istanza di sottoclasse NSManagedObject che ritornano improvvisamente a zero.L'attributo Core Data cambia su nil (correlato all'ARC?)

Supponiamo che la sottoclasse NSManagedObject si chiami Foo e che abbia un solo attributo chiamato valore. Una volta compreso che il valore era in qualche modo diventato nulla, sono andato a impostare la seguente categoria per monitorare le modifiche al valore.

@implementation Foo (Debug) 

- (void)setValue:(NSDate *)value 
{ 
    [self willChangeValueForKey:@"value"]; 
    [self setPrimitiveValue:value forKey:@"value"];  
    [self didChangeValueForKey:@"value"]; 
} 

- (NSDate *)value 
{ 
    [self willAccessValueForKey:@"value"]; 
    NSDate *value = [self primitiveValueForKey:@"value"]; 
    [self didAccessValueForKey:@"value"]; 

    return value; 
} 

@end 

setValue: viene chiamato per il mio oggetto e l'argomento passato è un NSDate non nullo. Quindi il valore viene recuperato (in un altro metodo). Lo stesso valore specificato è stato recuperato correttamente.

Tuttavia, quando un altro metodo tenta di leggere il valore, viene chiamato il valore accessor e un valore nil viene restituito da primitiveValueForKey :.

Tra le due letture setValue: non viene chiamato e l'oggetto Foo è ancora valido (non zero). In effetti non vengono eseguite altre operazioni di Core Data tra le due letture su qualsiasi oggetto Core Data o il contesto nel suo complesso.

Utilizziamo ARC nel nostro progetto. È possibile che ARC stia in qualche modo interferendo con le variabili dei miei dati di base e le dislocassimo? In caso affermativo qualcuno ha qualche suggerimento per il debug di deallocazioni ARC? O meglio ancora, qualcuno sa come garantire che ARC non storni la mia variabile.

Questo potrebbe non essere nemmeno correlato all'ARC, tuttavia sono un po 'in perdita su cosa sta succedendo. Qualsiasi suggerimento sarebbe molto apprezzato.

+0

ARC è ancora sotto NDA, quindi non possiamo discuterlo fuori dai forum ristretti di Apple. – TechZen

+8

[ARC non è sotto NDA.] (Http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-June/015588.html) –

+0

Ogni possibilità che stai lavorando su due thread diversi con due diversi copie dell'oggetto? Altrimenti, sei sicuro che questo sia esattamente lo stesso oggetto? Che non stai facendo due? O che non hai ripristinato il tuo contesto o hai perso le tue modifiche? –

risposta

11

Questo è molto probabilmente perché il NSManagedObjectContext che questi oggetti appartengono, sta andando via. Quando hai istanze di NSManagedObject in giro ma non stai mantenendo il contesto, gli oggetti gestiti inizieranno a restituire nil.

Sotto ARC, accertarsi di memorizzare il contesto in una variabile strong, vale a dire una variabile di istanza che non è weak o un static globale.

Non ARC, ovvero codice di conservazione, assicurarsi di mantenere il contesto.

+0

Qualcuno sa perché questo succede? Ho avuto lo stesso problema e ho potuto risolverlo solo usando la mia variabile managedObjectContext. Ma questo è fastidioso e suona più come un insetto. – lindinax

+0

È ** necessario ** mantenere il contesto. Questo non è un bug. Il contesto dell'oggetto gestito fa funzionare la maggior parte dei dati core. Se non si dispone di un contesto, gli oggetti gestiti non sanno con cosa interagire. –

+0

L'utilizzo di un ivar 'NSManagedObjectContext * mContext' non avrebbe funzionato? – lindinax

0

controllo del viewDidLoad-Metodo

profile = [NSEntityDescription insertNewObjectForEntityForName:@"MyProfile" inManagedObjectContext:profileContext]; 

speranza che questo funziona