0

ClassA.hを持っている場合

1. @ property(nonatomic、retain)NSMutableArray * arr;

ClassA.m

-(ClassA)関数{

    1.ClassA *obj = [[ClassA alloc] init]; 
    // initialize the arr
    // add another object into the arr
    2. [obj.arr addObject:nameOfAnObject]
    3. return obj; 

}

ClassBで、 (ClassA)関数メソッドを呼び出したいのですが。

ClassB.m

-(void)viewDidload {

  1.[super viewDidLoad];
  2.ClassA     *classAinB = [[classA alloc] init];                                                                        
  3.classAinB = [classA function];
  4.[classAinB release];

}

メモリ管理のルールによると、私はClassB.mにClassAinBを所有しているので、最後にそれを解放します。

私の質問は、ClassA.mで所有しているvar ClassAはどのようになっているのか、ClassBの3行目でコールバックした後も、arrにnameOfAnObjectオブジェクトが含まれているClassAのオブジェクトが残っているようにいつリリースする必要があるかです。

この問題について私にアドバイスしてください。コメントはここで歓迎します。ありがとう

4

3 に答える 3

2

自動解放プールに追加します。すなわちreturn [obj autorelease];。これにより、オブジェクトにrelease所有者がいない場合、実行ループの反復の最後にオブジェクトにメッセージが送信されます。

于 2012-05-08T14:07:32.270 に答える
1

手動保持リリースを使用する場合:classAの2つのオブジェクトを割り当てます。1つは、classB関数から直接割り当てる場合、もう1つは、その関数内でclassA関数を呼び出す場合です。したがって、3行目が実行されると、最初のclassAオブジェクトのリンク(classAinB varを上書き)が破棄されます。これはメモリリークです。classAのオブジェクトを返すファクトリメソッドを使用する場合は、そのメソッドを静的にします。

于 2012-05-08T14:13:32.017 に答える
1

あなたが持っているときはいつでもあなたはそれに一致allocするために対応する必要がありますrelease

LLMVコンパイラー(およびARCが有効)を備えたXCode 4.2 +では、参照カウントについて心配する必要がないため、オブジェクトを作成するときに、コンパイラーとしてalloc呼び出すことを心配する必要はありません。releaseエラーをスローします。

于 2012-05-08T14:09:33.003 に答える