2012-02-06 27 views
0

私は私が 上記を解放し、これを割り当てる必要が上記タブバーのcontroller.soに割り当てられたビュー・コントローラを変更する必要が私は、例えばすでに割り当てられている変数にメモリを割り当てていますか?

 self.m_tabbarController = [[TabbarController alloc] init]; 

already.for割り当てられているため、変数のためのメモリを割り当てる必要新しいコントローラを備えたタブバー。どのように私は 新しいone.Ifを解放し、割り当てることができます私が次の場合、クラッシュを与える。

if(self.m_tabbarController != nil) 
    { 
     [self.m_tabbarController release];  
    } 
      self.m_tabbarController = [[TabbarController alloc] init]; 

が、自己の変数がのdealloc method.anyヘルプにdeallcatedしなければならない、私はまた、次のように行いますか?、それがクラッシュできますしてください?

m_tabbarController = [[TabbarController alloc] init]; 
    [self.window addSubview:m_tabbarController ]; 
    [m_tabbarController release]; 

答えて

0

プロパティの種類を保持するようにm_tabbarControllerを宣言する必要があります。

さて、以下のようにコードを変更:

TabbarController *temp = [[TabbarController alloc] init]; 

self.m_tabbarController = temp; 

[temp release]; 

をまた、dealloc方法にm_tabbarControllerをリリース。

2

最初にリリースします。あなたの合成されたプロパティと仮定すると、実装があなたのためにreleaseを処理する、retainです:あなたはクラスの再初期化の方法のいくつかの種類を実装していない限り、要するに

self.m_tabbarController = [[[TabbarController alloc] init] autorelease]; 

は、インスタンスを再初期化するためにいくつかの方法に頼ることはできません。

UIViewControllerの場合は、再初期化を正しく実装するには、実装、すべてのサブクラス、すべてのメンバー/ ivarsについて十分に知っておく必要があるため、新しいUIViewControllerを作成してください。場合によっては、パブリックプロパティを使用してこれを行うこともできます。インスタンスを正しく再初期化できることもあります。

再初期化の問題の1つは、allocが返されるものではない可能性があることです。また、すべてのケースで特に扱っているタイプが分からない場合があります。複雑な型の適切な、網羅的な再実装は、多くの実装を追加します(これも推移的な傾向があります)。

+0

絶対に大丈夫です。 – omz

+0

@omzなぜ私はそれを書いたかわからない= pありがとう/更新しました – justin

+0

@Justin、あなたのソリューションは絶対に正しいです。しかし、このシナリオでは 'autorelease'を使わないでください。 'autorelease'を使う代わりに、プロパティに値を割り当てた後に' release'を使います。 –

-1

[self.m_tabbarController release];m_tabbarControllerないselfそう

if(self.m_tabbarController != nil) 
    { 
     [self.m_tabbarController release];  
    } 
self.m_tabbarController = [[TabbarController alloc] init]; 

をリリースする予定の新しい値が完全に不必要で割り当てる前nil` `にプロパティを設定する

+0

メモリリークが発生する可能性は非常に高いです。 – omz

+0

@omz '@ property'を' assign'と宣言しているかもしれません。 self.m_tabbarController = [[TabbarController alloc] init];と書かれていれば、それは 'retain'であると推測できます。それで、私は彼がそれを取り戻していないと仮定します... –

+0

宣言のポイントが表示されませんプロパティを 'assign'としますが、その値を保持します。 – omz

0
self.m_tabbarController = nil; 
TabbarController *tempController = [[TabbarController alloc] init]; 
self.m_tabbarController = tempController; 
[tempController release]; 
tempController = nil; 
関連する問題