Objective-C でのスレッド化についてもっと学びたいと思ったので、ループしてループの繰り返しを出力する小さなテスト プログラムを作成しました。ただし、得られる出力は期待したものではありません。理由については考えがありますが、最初に私のコードを次に示します。
main.m
#import <Foundation/Foundation.h>
#import "Car.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Car* myCar = [[Car new] autorelease];
[myCar performSelectorInBackground:@selector(LoopAndSay) withObject:nil];
for(int i = 0; i < 100; i++ )
{
NSLog(@"Main loop on %i", i);
}
}
return 0;
}
車.m
#import "Car.h"
@implementation Car
@synthesize name, model;
-(void) LoopAndSay {
for(int i = 0; i < 100; i++)
{
NSLog(@"Looping for the %i time", i);
}
}
@end
ここで、そのまま実行すると、バックグラウンド ループが完了しないことがあります (反復 94 と 97 の間で停止します)。さらに、バックグラウンド ループがメイン スレッド ループの後まで呼び出されないようにコードを切り替えると、反復は実行されません。これは、メイン スレッドが終了していて、バックグラウンド スレッドの実行が完了するのを待ちたくないためですか? この場合、メイン スレッドとバックグラウンド スレッドの両方が完了するまでプログラムを強制的に実行し続ける方法はありますか?