0

myObj が次のように定義されている場合、誰かが (ARC を使用して) 以下の違いを説明できますか?

@property(nonatomic, weak) MyType *myObj;

ローカル変数による代入:

MyType *_myObj = [MyType new];
self.myObj = _myObj;

self.myObj = [MyType new];

前者の場合、オブジェクト インスタンス myObj は存続しているように見えますが、後者の場合、インスタンスは、囲んでいる関数が完了するとすぐに割り当てが解除されます。違いは何ですか?それらは同じであるべきではありませんか?

[編集] 私は弱いと指定したことを理解していますが、私の質問はまだ残っています。なぜこれが反対票を投じているのかわかりません。

4

2 に答える 2

4

プロパティは弱いと定義されているため、割り当てによって保持数が増えることはありません。

コードの2番目のビットでは、オブジェクトを作成し、それをweakプロパティに割り当てます。これが行われるとすぐに、作成されたオブジェクトが解放され、割り当てが解除され、weakプロパティがnilにリセットされます。

コードの最初のビットでは、作成したオブジェクトを強力なローカル変数に割り当てます。次に、強いローカル変数を弱いプロパティに割り当てます。ローカル変数がスコープ内にある限り、作成されたオブジェクトには参照があります。ローカル変数がスコープから外れるとすぐに、オブジェクトは解放され、割り当てが解除され、weakプロパティはnilに設定されたままになります。

最終結果は同じです。メソッドが競合する場合、作成されたオブジェクトには他の参照がないため、プロパティはnilのままになります。2つの違いは、これがどれだけ速く発生するかだけです。

于 2012-12-06T05:59:47.137 に答える
0

私はそれをテストしました、そしてそれは同じ結果です

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //NSObject *_myObj = [NSObject new];
    //self.myObj = _myObj;
    self.myObj = [NSObject new];

}

- (IBAction)click:(id)sender {
    NSLog(@"%@",self.myObj);
}

どちらの場合も、次のように出力されます:(null)

于 2012-12-06T05:58:58.487 に答える