0

Region というコスチューム クラスがあり、このコードを使用して region 変数を初期化していますが、このコードの最後で myAppDelegate.provisoryRegion が nil ではなく、region が nil である可能性はありますか? myAppDelegate.provisoryRegion は参照によってリージョンに渡されませんか??? このコードの最後で region が nil であることは 100% 確信しています。

Region *region=myAppDelegate.provisoryRegion;
if (!myAppDelegate.provisoryRegion) {
    myAppDelegate.provisoryRegion=[[Region alloc]init];
}
if (!region){ NSLog(@"region is nil");
}  
4

2 に答える 2

1

はい。ゼロでなければなりません。オブジェクトを変更するためです。

myAppDelegate.provisoryRegionmyAppDelegate.provisoryRegion=[[Region alloc]init];を実行すると、新しいオブジェクト (ヒープ上の新しいアドレス) を指します。

*region新しいアドレスには従いません!

その*regionため、引き続きNULLアドレスを指します。

しかし、なぜ 1 行目にポインターをコピーするのでしょうか? 常に使用しないのはなぜですかmyAppDelegate.provisoryRegion*regionのリンクされていないエイリアスですmyAppDelegate.provisoryRegion

サンプル ダミー コードの最後で実行し、1 行目を削除します。

if (!myAppDelegate.provisoryRegion){ NSLog(@"region is nil");
}  

ところで...

myAppDelegate.provisoryRegion=[[Region alloc]init];

メモリ リークのように見えます (@property が保持に設定されている場合)。

次で修正します。

myAppDelegate.provisoryRegion=[[[Region alloc] init] autorelease];
于 2012-04-09T10:40:33.457 に答える
1

regionメモリアドレスを含む変数です。 myAppDelegate.provisoryRegionメモリアドレスを含む別の変数です。

コードの最初の行には、myAppDelegate.provisoryRegion次にコピーする nil のメモリ アドレスが含まれていますregion。つまり、 のメモリ アドレスではなく、 nilregionメモリ アドレスも含まれています。 myAppDelegate.provisoryRegion

次に、nil かどうかをテストしますmyAppDelegate.provisoryRegion。これは nil であり、その内容を新しいインスタンス myAppDelegate.provisoryRegionのメモリ アドレスに設定します。Region

region はまったく別の変数であり、まだ nil のメモリ アドレスが含まれています。したがって、最終的にテストregionしているときは、まだ nil です。

于 2012-04-09T10:41:20.600 に答える