0

カスタムスレッドを使用してオブジェクトを作成し、それらを使用する場合、私は知っています。iOSアプリケーションで以下のコードを試しましたが、エラーは発生しませんでした。なんで?

-(void)Sample{

            NSLog(@"Sample");
            NSString *temp= @"asdfasdf";

            NSArray *tempAray = [NSArray arrayWithObject:temp];


            NSLog(@"Print it %@%s",temp,__FUNCTION__);

}

-(void)viewDidLoad{

            [super viewDidLoad];
            [NSThread detachNewThreadSelector:@selector(Sample) toTarget:self withObject:@"NSSstint"];
            // Do any additional setup after loading the view, typically from a nib.
}

編集:

オブジェクトに自動解放メッセージを渡した場合、メモリがリークするという事実を理解しています。サンプルメソッド呼び出しに以下のメソッド実装を使用しました:今でも以下のメッセージを受け取りませんでした:

*** __NSAutoreleaseNoPool(): object 0x167ba4 autoreleased without a pool in place - just leaking ***


 -(void)Sample{

    NSLog(@"Sample");
    NSString *temp=[[NSString alloc] initWithFormat:@"Sample"];

    NSArray *tempAray = [NSArray arrayWithObject:temp];
    [tempAray retain];
    [tempAray autorelease];
    [temp autorelease];


    NSLog(@"Print it %@%s",temp,__FUNCTION__);

}
4

1 に答える 1

1

それはあなたにログメッセージを与えるだけなので、それはエラーを引き起こしません。自動解放プールを作成せずに新しいスレッドでオブジェクトを自動解放すると、次のような大量のメッセージが表示されます。

*** __NSAutoreleaseNoPool(): object 0x167ba4 autoreleased without a pool in place - just leaking ***

しかし、これはNSExcpetionを投げることと同じではありません。また、これから得られる可能性のある「正常に動作する」という印象は間違っています。メモリリークが発生し、メモリ不足でアプリがクラッシュすることがあります。

于 2012-08-06T12:12:45.110 に答える