問題 : nil に設定された後、静的オブジェクトで dealloc メソッドが呼び出される順序で奇妙な動作が見られます。
問題を説明するために、2 つのメソッドを持つ BBSampleClass というクラス名を使用しました。
interface BBSampleClass : NSObject
+ (BBDummyObject*)getInstance;
+ (void)cleanUp;
@end
static BBSampleClass *sInstance = nil;
@implementation BBSampleClass
+ (void)initialize
{
sInstance = [[BBDummyObject alloc] init];
}
+ (BBDummyObject*)getInstance
{
return sInstance;
}
+ (void)cleanUp
{
sInstance = nil;
}
- (void)dealloc
{
NSLog(@"BBSampleClass Object Dealloc");
}
@end
私のアプリケーションのある時点で、 BBSampleClass でクラス メソッド cleanUp を呼び出すと(静的インスタンス変数sInstanceをnilに設定します)、他のステートメントを実行する直前にその dealloc が呼び出されることが予想されます。これは、その時点で他のオブジェクトが sInstance を所有していないためです。 .
つまり、これら2つのステートメントを実行します
[BBSampleClass cleanUp]
NSLog(@"After Cleanup");
コンソールに次のように出力する必要があります。これは正しいです。
**2013-01-11 14:14:32.280 BBSampleCode[7781:c07] BBSampleClass Object Dealloc
2013-01-11 14:14:32.280 BBSampleCode[7781:c07] クリーンアップ後**
ただし、このようにgetInstanceクラス メソッドを介して BBSampleClass のオブジェクトを取得しようとすると、
[BBSampleClass getInstance];//do something with object
[BBSampleClass cleanUp];
NSLog(@"After Cleanup");
NSLog ステートメントの実行順序が逆になります。つまり、ステートメントNSLog(@"After Cleanup")の実行後に BBSampleClass の静的オブジェクトの割り当てが解除されますが、これは誤りです。
**2013-01-11 14:15:43.940 BBWebView[7811:c07] After Cleanup
2013-01-11 14:15:43.940 BBWebView[7811:c07] BBSampleClass Object Dealloc**
編集:解決策
[BBSampleClass getInstance] を @autoreleasepool { } ブロックに移動すると、問題が解決します。