2012-02-26 4 views
2

渡されたパラメータを正しく保持することを怠ったクラスの1つにインスタンスがありました。追跡にはかなり時間がかかりました。未取得のivarsのユニットテスト

これを修正するには、その状況のテストを作成したいが、どのように進めるかは分かりません。 autoreleaseプールがオブジェクトをすぐに離すことにしたかどうかに応じてテストをパスできるので、オブジェクトを作成して各メンバーをテストするのは簡単ではないようです。

私の質問は:オブジェクトを作成してテストを行う前に自動解放が行われることを確認する方法はありますか?テストケースに自分自身のプールを作成して、ivarテストを実行する前にリリースする必要がありますか?それは時間の100%このケースをキャッチしますか?潜在的なクラッシュを積極的にキャッチするために、すべてのテストをオートリリースプールに入れておくべきですか?

答えて

2

オートレアルではないオブジェクトを与えるコンストラクタを使用する場合、これについて心配する必要はありません。しかし、それ以外の場合は、自動解放プールを使用する必要があります。

NSArray *anArray = [[NSArray alloc] init]; 
self.array = anArray; 
[anArray release]; 
NSLog(@"Here's my array: %@", self.array); // EXC_BAD_ACCESS if array not retained 

をこのwouldnに対し:

これは、その保持カウントがreleaseに0になり、それがすぐに割り当て解除されますのでarrayは、セッターによって保持されていない場合にのみ、すぐにあれば、あなたにEXC_BAD_ACCESSを取得します「トンは、すべてのエラーを引き起こし、self.arrayは、すぐに自動解放プールが排出したとして、後にゴミになるにもかかわらず:

self.array = [NSArray array]; 
NSLog(@"Here's my array: %@", self.array); // No error for now 

あなたは簡易コンストラクタを使用する必要がある場合は、単に割り当てをラップ自動解放プールにメンター:

NSAutoreleasePool *testPool = [[NSAutoreleasePool alloc] init]; 
self.array = [NSArray array]; 
[testPool drain]; 
NSLog(@"Here's my array: %@", self.array); // EXC_BAD_ACCESS if array not retained 

この方法で、あなたは限りarrayはセッターによって保持されていないとして再度EXC_BAD_ACCESSを取得します。

+1

[self.array release]を使用すべきではありません。テストメソッド内のローカル変数として配列を持ち、それを解放する方がよいでしょう。 – jrturton

+0

よろしくお願いします。私の答えは決まった。 – yuji

関連する問題