2012-04-09 20 views
0

私は地域と呼ばれるコスチュームクラスを持っていますが、リージョン変数を初期化するためにこのコードを使用しています。このコードの最後にmyAppDelegate.provisoryRegionがnilでなく、リージョンがnilでないとどうなりますか? ?? regionに参照渡しされたmyAppDelegate.provisoryRegionではありませんか? このコードの最後に領域がnilであることを100%確信しています。ポインタと参照

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

答えて

1

はい。それは無しでなければならない。 オブジェクトを変更するため!

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

*region新しいアドレスに従います!

したがって*regionは、依然としてNULLアドレスを指しています。

なぜ、1行目にポインタをコピーするのですか? いつもmyAppDelegate.provisoryRegionを使用しないでください。

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

は次のようになります...

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

ところで:*regionはちょうどあなたのサンプルダミーコードで終わりで行い、1行目を削除myAppDelegate.provisoryRegion

のリンク解除別名ですメモリリーク(あなたの@propertyがretainに設定されている場合)

修正:

myAppDelegate.provisoryRegion=[[[Region alloc] init] autorelease]; 
+0

私はmyAppDelegateへの参照が弱い参照であるため、ARCを使用していますので、ARCは正常に動作します。今、私はそれを得ました、どのように明らかです...私のコード領域では、常にどこにもポイントがありません。myAppDelegate.provisoryRegionでは決して一点ではありません。ちょっとありがとうございました...私は、私が2週間にmyAppDelegate.provisoryRegionを使用しなければならないので、私が投稿したコードを使用しています。ちょうど便宜のために地域と呼んでいます... – user1162866

1

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

あなたのコードmyAppDelegate.provisoryRegionの最初の行はregionもゼロのメモリアドレス、myAppDelegate.provisoryRegionませメモリアドレスが含まれている、すなわちあなたがregionにコピーゼロのメモリアドレスが含まれています。

次に、myAppDelegate.provisoryRegionがnilであるかどうかをテストします。したがって、myAppDelegate.provisoryRegionの内容を新しいRegionインスタンスのメモリアドレスに設定します。

領域は、まだメモリアドレスnilを含む完全に異なる変数です。だから、最後にregionをテストしているときは、それはまだゼロです。

+0

よく奇妙に思えますなぜなら私はregion = nilを書いていないので、region = myAppDelegate.provisoryRegionと書いたので、myAppDelegate.provisoryRegionを変更した場合、その領域は現在メモリアドレスへのポインタになります。あまりにも変わる?すべてのポインタがそのように機能した後? – user1162866

+0

これを少しだけ明確にするために私の答えを更新しました。 – mttrb