2011-11-25 6 views
7

私はARCが新しく、内部クラスをメンバーとして持つオブジェクトを持っています。 initメソッドでは、新しいオブジェクトを割り当てたい。なぜ私は/ init - allocを得ることができません "危険なプロパティに保持されたオブジェクトを割り当てる"警告?

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

しかし、私はエラー "安全でないプロパティに保持オブジェクトの割り当て" を取得します。私はインターウェブ上で検索し、この特定の警告に関する他の情報は見ない。これはコンパイルされますが、実行時の不正アクセス例外が発生します。

+3

.hファイルをインスタンス変数とともに投稿してください。ここのコードは不完全です。 – futureelite7

+2

"at"プロパティ(割り当て)を "at"プロパティ(強く、非原子的)に変更するまで同じ問題が発生しました –

答えて

12

すぐに問題が発生するのは、weakと記されたメンバーにオブジェクトを割り当てているということです。つまり、オブジェクトは強力な参照を持たず、直ちに割り当てが解除されます。 weakまたはassignの代わりにstrongまたはretainを使用すると、それが解決されます。

-initメソッドの大きな問題は、[super init]を呼び出さず、何も返さないということです。最低でも、-initは次のようになります。

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

ありがとう、私は[super init]を簡潔にしていましたが、説明のおかげで、なぜIBOutletsが弱く、xibの外側にあるメンバーオブジェクトが強い必要があるのか​​分かります。 –

関連する問題