2011-08-04 5 views
0

私は既に保持している合成しているNSDateインスタンスでUIViewController(Aと呼ぶ)を持っています。他のオブジェクトから保持されている変数を保持していますか?

私は別のUIViewController(Bと呼ぶ)を作成していて、NSDateインスタンスに渡したいと思っています。 Bでは、私はそれを使用するつもりです。このインスタンスも保持して合成する必要がありますか?私はBがAと同じNSDateインスタンスを使用していると仮定し、メモリが不足しているとAのインスタンスがviewDidUnloadで削除される可能性があります。

一方、私がそれを保持して合成すると、私はBの視点がなくなったときにそれを割り当て解除するつもりです。私がAに戻ると、NSDateのインスタンスはなくなります。

ここでは、ベストプラクティスは何ですか?私はちょうどBで新しいNSDateオブジェクトを作成し、渡されたものと同じ日付にする必要がありますか?この新しいインスタンスを保持/合成しますか?

答えて

0

私はあなたの質問を間違っているかもしれませんが、Objective Cで参照カウントがどのように機能するかについて非常に良い考えがあるようには聞こえません(私はそれを嫌うわけではありません。あなたのメモリを適切に管理している場合、Bのビューがなくなると、NSDateインスタンスの割り当てが解除されません。あなたのセットアップは、このようなものでなければなりません。あなたのBインスタンスの割り当てが解除されたときに今、あなたのNSDateインスタンスががリリースされます

// A.h 
@property(nonatomic, retain) NSDate *myDate; 
@synthesize myDate; 

// A.m 
- (id) init 
{ 
    if (self = [super init]) 
    { 
     // Setter retains the new NSDate instance; its reference count is now 1 
     // (after autorelease) 
     [self setMyDate:[NSDate date]]; 
    } 

return self; 
} 

- (void) someMethod 
{ 
    // Assume b is a pointer to your B instance. B's setter retains the NSDate 
    // again; it's reference count is now 2 
    [b setMyDate: myDate]; 
} 

- (void) dealloc 
{ 
    [myDate release]; 
} 

// B.h 
@property(nonatomic, retain) NSDate *myDate; 
@synthesize myDate; 

// B.m 
- (void) dealloc 
{ 
    // Assuming B is deallocated first, the NSDate's reference count will 
    // now be 1. It will still be accessible to the A. 
    [myDate release]; 
} 

解放されることは、割り当て解除されることと同じではありません。解放されたオブジェクトは、もともとAインスタンスによって保持されていたため、参照カウントが1になります。 NSDateインスタンスは、Aインスタンスがインスタンスを解放し、参照カウントがゼロになるまで、割り当て解除されません。希望が役立ちます。

Objective Cのメモリ管理の詳細については、hereを参照してください。 this questionも参照してください。

+0

しかし、BのviewDidUnloadでは、NSDateインスタンスがnilに設定されています。まだAがそれを保持しているときはこれは問題ではないですか?またはviewDidUnloadでnilに設定しないでください。 –

+0

'A'と' B'は 'NSDate'インスタンスへの別々のポインタを保持します。 Bの 'viewDidUnload'が呼び出されると、その_pointer_を' NSDate'インスタンスに 'nil'に設定します。インスタンス自体は依然としてメモリ内に存在し、依然として「A」にアクセス可能である。 '** NSDate'へのポインタを最初に解放せずに' nil'に設定すると、** **問題になります。これは、メモリリークを引き起こします。なぜなら、 'NSDate'の保持カウントは正しくデクリメントされないので、決して解放されないからです。 –

+0

'viewDidUnload'で' NSDate'をリリースして 'nil'する必要があるかどうかについては、そうする価値はないと思います。'A'によってまだ保持されているので、' B'の 'viewDidUnload'が呼び出されたときにあなたの' A'インスタンスがまだ存在すれば、メモリから解放されません。したがって、あなたはその方法でそれを解放することによって、本当に何も達成していません。 –

0

私はあなたが望むものを完全に理解しています。私はあなたにNSDateのプロパティを作ることをお勧めします。

//.h

NSDate *date; 

@property(nonatomic,retain) NSDate *date; 

//.m 

@synthesize date; 

そしてBのViewControllerに日付を使用。 最初に実行していた操作はviewDidLoadであってはなりません。viewWillAppearである必要があります。 BからAからviewWillAppearが常に呼び出されると、これは日付の値を取得するのに役立ちます。

関連する問題