0

Objective Cでは、別のオブジェクトが所有するオブジェクトを明示的に解放するにはどうすればよいですか? あるいは、所有しているオブジェクトに、子オブジェクトをもう所有していないことを同等に通知することもできます。次の点を考慮してください。

- (void) testWithNSString:(NSString *)val
{
  NSData *data = [val dataUsingEncoding:NSASCIIStringEncoding];
  // ...
  // now I want to explicitly release data e.g. due to low memory
}

In[val dataUsingEncoding:NSASCIIStringEncoding]オブジェクトNSDataが返され、(所有権の一般的な慣習により) が解放されるとオブジェクトが解放されると想定していますval。これは、漏れのない観点からは許容できるようです。しかし、この戦略には 2 つの問題があります。

  1. dataメモリ不足などの理由でオブジェクトを明示的にすぐに解放したい場合はどうすればよいですか?
  2. (が返された後) の呼び出し元に、突然新しいオブジェクトの所有権を持ったオブジェクトtestWithNSStringが残されないようにしたい場合はどうすればよいですか?NSString valtestWithNSString
4

3 に答える 3

2

まず第一に、自分が所有していないオブジェクトを決して解放してはなりません。返されたNSDataオブジェクトは、が解放されたときに解放されませんvaldata2つのオブジェクトは完全に独立しています(から発生したものを除くval)。

dataUsingEncoding:自動解放されたオブジェクトを返します。つまりdata、実行ループの最後に解放されます。

メモリが不足することを恐れて、それを早く解放したい場合は、NSAutoreleasePoolプールを使用できます。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSData *data = [val dataUsingEncoding:NSASCIIStringEncoding];
// do something with data.
[pool release];

これはdata、プールを解放すると解放されます。

于 2012-11-29T09:49:44.713 に答える
1

[val dataUsingEncoding:NSASCIIStringEncoding] で NSData オブジェクトが返され、(一般的な所有権の慣習により) val が解放されたときに解放されると思います。

これは正しくありません。(寿命に関して)とは関係のないdataUsingEncoding新しいオブジェクトを作成します。これはオブジェクトであり、何らかの方法で保持しない限り、実行ループの次のサイクルで解放されます (およそ、正確にはわかりません)。NSDatavalautoreleased

メモリ不足などの理由でデータ オブジェクトを明示的に解放したい場合はどうすればよいですか?

オブジェクトをすぐに解放したい場合で、ARC を使用している場合は、単純にそのポインターに nil を割り当てることができます。

data = nil;

ARC を使用していない場合、最適なオプションは、実行ループの自動解放プールが機能するまで待つことです。または、メソッドにローカル自動解放プールを作成して、自動解放されたオブジェクトが次の実行ループ サイクルではなくメソッドの最後に排出されるようにすることもできます。これは、長時間実行されるメソッド(またはメソッドのチェーン)の場合にのみ違いを生むため、あなたの場合に意味があるかどうかはわかりません.

testWithNSString の呼び出し元に NSString val オブジェクトを (testWithNSString が返された後に) 残したくない場合はどうすればよいでしょうか。これは突然新しいオブジェクトの所有権を持ちますか?

私が言ったように、valは の所有権を持っていませんdata

これをすべてまとめると、dataオブジェクトは自動解放され、メソッドが終了するとすぐに解放されます (長時間実行されるメソッドでない限り)。そのため、dataメモリは効率的な方法で回復され、私はそれについて心配する必要はありません (私が言ったように、それが長時間実行される方法でない限り)。

于 2012-11-29T09:47:04.573 に答える
-1

ARC を使用していると仮定すると、valnil に設定すると解放されます。

于 2012-11-29T09:48:12.500 に答える