1

私はそのようなコードにこだわっています:

static NSMutableSet* test_set;

-(void)foo1
{
  test_set=[NSMutableSet setWithObject:[NSNumber numberWithInt:1]];
  NSLog(@"count:%d",[test_set count]);
}


-(void)foo2
{
  NSLog(@"pointer:%p",test_set);
  NSLog(@"count:%d",[test_set count]); // here I get EXC_BAD_ACCESS
}

foo1 の後にのみ foo2 を呼び出します。私のデバッグアウトは次のようなものです:

count:1
pointer:0x262790
Program received signal:  “EXC_BAD_ACCESS”.

どうしたの?__ 興味深い注記: foo2 が予定どおりに呼び出している場合にのみ失敗します。__ 申し訳ありませんが、詳細を見逃していました。どちらも完璧に機能します。皆さん、ありがとうございました

4

2 に答える 2

0

に割り当てられているオブジェクトの所有権を取得してtest_setいません。つまり、-foo2が送信される前に割り当てが解除される可能性があります。一般に、メソッドの実行後にオブジェクトを存続させる必要がある場合は、そのオブジェクトの所有権を取得する必要があります — たとえば、+allocorを介して-retain:

-(void)foo1
{
  test_set=[[NSMutableSet alloc] initWithObjects:[NSNumber numberWithInt:1], nil];
  NSLog(@"count:%d",[test_set count]);
}

また

-(void)foo1
{
  test_set=[[NSMutableSet setWithObject:[NSNumber numberWithInt:1]] retain];
  NSLog(@"count:%d",[test_set count]);
}

オブジェクトの所有権を取得および放棄する規則については、「メモリ管理プログラミング ガイド」で説明されています。

于 2011-06-15T13:05:51.640 に答える
0

test_set を保持していません。によって返されるセットはsetWithObject:自動解放されます。追加すると

[test_set retain];

setWithObject:からセットを取得した後foo1()、追加します

[test_set release];

の最後までfoo2()、動作するはずです。

おそらく Cocoa Memory Management Programming Guideを読むべきでしょう。

于 2011-06-15T13:06:22.837 に答える