2011-11-25 5 views
7

Jestem nowy w ARC i mam obiekt, który ma pewne wewnętrzne klasy jako członków. W metodzie init chcę przydzielić dla nich nowe obiekty.Dlaczego nie mogę przydzielić/init - uzyskać ostrzeżenie "Przypisywanie zatrzymanego obiektu do niebezpiecznej właściwości"?

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]; 
} 

Ale otrzymuję "Przypisywanie zatrzymany przedmiot własności niebezpieczny" błędów. Przeszukałem strony internetowe i nie widziałem żadnych innych informacji na temat tego konkretnego ostrzeżenia. Kompiluje, ale dostaje wyjątek dostępu do złych warunków środowiska wykonawczego.

+3

Proszę, opublikuj plik .h ze swoimi zmiennymi instancji. Twój kod jest tutaj niekompletny. – futureelite7

+2

Miałem ten sam problem, dopóki nie zmieniłem właściwości "at" (przypisz) na właściwość "at" (silna, nieatomowa). –

Odpowiedz

12

Natychmiastowym problemem jest przypisanie obiektu do elementu oznaczonego weak, co oznacza, że ​​obiekt nie będzie miał silnego odniesienia i zostanie natychmiast zwolniony. Użycie strong lubzamiast weak lub assign naprawi to.

Większy problem z metodą -init polega na tym, że nie wywołuje ona [super init] i nie zwraca niczego. Co najmniej Twój numer -init powinien wyglądać następująco:

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

Dzięki, utrzymałem [super init] dla zwięzłości, ale dla kompletności masz rację. I dziękuję za wyjaśnienie, wiem, że rozumiem, dlaczego IBOutlety są słabe, a obiekty członkowskie spoza Xib muszą być silne. –

Powiązane problemy