0

オブジェクトは値を与えたまま解放されました。ARC はマークされていません (オフを意味します)

-(void)viewDidLoad
{   
     [super viewDidLoad];

     // Do any additional setup after loading the view, typically from a nib.
     //test of retain and copy

      NSString *s1 = [[NSString alloc] initWithString:@"String1"];
      NSString *s2 = [s1 copy];

      [s1 release];
      [s1 release];
      [s2 release];

      if(s1!=nil)
      {
            NSLog(@"11111");
            NSArray *array = [[NSArray alloc] initWithObjects:@"1",@"2",@"3", nil];
            [array release];

            NSLog(@"S1 - %@ \n S2 - %@ \n Array - %@",s1,s2,array);
       }
  }

===出力===

2012-12-14 15:04:01.165 testMM[940:207] 11111 2012-12-14 15:04:01.168 testMM[940:207] S1 - 文字列 1 S2 - 文字列 1 配列 - S1 - 文字列 1 S2 - 文字列 1 配列 -

4

1 に答える 1

0

まず、割り当て解除されたオブジェクトへのアクセスは未定義の動作です。元のオブジェクトのように見えるものにアクセスしたり (使用したメモリが上書きされていない場合)、別のオブジェクトにアクセスしたり (後でそこに割り当てられた場合)、ランダムなガベージにアクセスしたり (まったくオブジェクトではない) する可能性があります。 )、またはクラッシュしたり、他の奇妙なことをしたりする可能性があります。ゾンビをオンにして実行し、割り当て解除されたオブジェクトの呼び出しをキャッチしない限り、オブジェクトが割り当て解除されているかどうかを判断する方法はありません。

それだけでなく、すべての保持を解放した後でも、オブジェクトがいつ割り当て解除されるかという保証はありません。オブジェクトは、保持カウントが 0 になると割り当てが解除されます。ただし、オブジェクトを割り当てて解放したとしても、一部の API がそれを保持してから自動解放した可能性があります。たとえば、配列を割り当ててすぐに解放しますが、配列initWithObjects:自体を保持して自動解放する可能性があります (オブジェクトを保持して自動解放することは決して間違っていません) init

具体的には、この場合、文字列の場合、@"String1"静的メモリに存在するリテラル文字列であり、そのメモリ管理操作は好きretainrelease何もしません。NSString、定数文字列に基づいて新しい文字列を作成すると、単にその定数文字列が返されます。またcopy、定数文字列では、その定数文字列も返します。したがって、基本的にs1s2両方とも、永遠に存続する静的メモリ内の文字列リテラルを指します。releaseそれらには効果がありません。(しかし、メモリ管理ルールの観点からはまだ正しくありません。)

array割り当てられ、リリースされました。ここで起こりそうなこと (上記の理由により、ここで推測しています) は、配列が実際に割り当て解除されていることですが、メモリのその部分は、非常に短い期間だったため、印刷するまでに上書きされませんでした。繰り返しますが、これは未定義の動作です。

于 2012-12-14T22:31:10.527 に答える