1

ARC が有効になっています。「dealloc」メソッドが呼び出されないのはなぜですか? ここで@autoreleasepoolを使用する必要がありますか? なんで?ありがとうございました。

@interface Test : NSObject
@end

@implementation Test

+(id)testFromNothing
{
  id res = [Test alloc];
  return res;
}

-(void)dealloc
{
  NSLog(@"deallocated");
}

@end


int main(int argc, const char * argv[])
{
  Test* test = [Test testFromNothing];
  return 0;
}
4

1 に答える 1

5

はい、で自動解放プールを使用する必要がありますmain。もう1つの問題は、でオブジェクトを初期化していないことですtestFromNothing

理由:スレッドが入力される場所(メインスレッドを含む)には、自動解放プールを作成する必要があります。もちろん、そのスレッドがCコードのみを使用している場合、objcオブジェクトは自動解放されないため、これらのシナリオでは不要です。

「なぜ?」について --ARCも自動解放を使用し、自動解放プールが常に配置されていることを期待しています。ARCは自動解放プールを使用する可能性もあると想定しているため、プログラムは自動解放セマンティクスを正しくサポートする必要があります。また、自動解放プールを正しく設定するのはプログラマーの責任です(状況によっては)。ARCはGCとは異なり、参照カウント操作と参照カウント操作が発生するシーケンスに関してMRCと非常によく似ています。GCでは、いくつかの収集スキームを使用できます(たとえば、収集前に大幅な増加が見られる場合や、収集がセカンダリスレッドで発生する可能性がある場合)が、ARCは、適切に構造化された保持/解放/自動解放操作と同様に動作します。拡張機能。

于 2013-03-05T10:43:49.430 に答える