2011-11-25 10 views
7

Sono nuovo ad ARC, e ho un oggetto che ha alcune classi interne come membri. Nel metodo init voglio allocare nuovi oggetti per loro.Perché non è possibile allocare/init - ottenere l'avviso "Assegnazione di un oggetto conservato a una proprietà non sicura"?

ClassA.h

#import "ClassB.h" 
@interface ClassA : NSObject 
@property (assign) ClassB *member; 
@end 

ClassB.h

@interface ClassB : NSObject 
@property (assign) NSString *name; 
@end 

ClassA.m

@synthesize member = _member; 
-(id)init 
{ 
    _member = [[ClassB alloc] init]; 
} 

Ma ottengo "Assegnazione oggetto conservato alla proprietà non sicuri" errori. Ho cercato tra le reti interne e non ho visto altre informazioni su questo avvertimento specifico. Compilare, ma ottiene un'eccezione di accesso errato di runtime.

+3

Si prega di inviare il file .h con le variabili di istanza. Il tuo codice qui è incompleto. – futureelite7

+2

Ho avuto lo stesso problema fino a quando ho cambiato la proprietà "at" (assign) in "at" (strong, nonatomic) –

risposta

12

Il problema immediato è che si assegna l'oggetto a un membro contrassegnato con weak, il che significa che l'oggetto non avrà un riferimento sicuro e verrà deallocato immediatamente. L'utilizzo di strong o retain anziché weak o assign lo risolverà.

Un problema più grande con il metodo -init è che non chiama [super init] e non restituisce nulla. Come minimo, il tuo -init dovrebbe essere simile al seguente:

-(id)init 
{ 
    self = [super init]; 
    if (self != nil) { 
     self.member = [[ClassB alloc] init]; 
    } 
    return self; 
} 
+1

Grazie, ho mantenuto il [super init] per brevità, ma per completezza sei corretto. E grazie per la spiegazione, so che capisco perché gli IBOutlet sono deboli, e gli oggetti membri al di fuori del xib devono essere forti. –

Problemi correlati