3

重複の可能性:
NSMutableArray の lastObject はオブジェクトのコピーを返しますか?

私はiOS開発に関するスタンフォードのコースに従っていますが、疑問があります。問題は、「オペランド」(NSNumbers) を持つ配列 (operandStack) があり、最後の要素をポップアウトして配列から消去する関数が必要なことです。これはチュートリアルが言うことです(そしてそれは機能します):

- (double)popOperand
{
    NSNumber *operand = [self.operandStack lastObject];
    if(operand) [self.operandStack removeLastObject];
    return [operand doubleValue];
}

私の質問は次のとおりです: NSNumber *operand を使用して最後のオブジェクトを「指している」だけで、次の行でこの最後のオブジェクトを削除した場合、それを返すことはどのように可能でしょうか? つまり、最後のオブジェクトを削除し、オペランドがそのオブジェクトを指しているだけの場合、オペランドは何も指していないはずなので、オペランドを返すことができる方法を理解できません...オペランドは配列の最後のオブジェクトのコピーでしたが、そうではありません...

私の英語で申し訳ありません:SI私が自分自身を明確にしたことを願っています.

ありがとう、

カルロス

4

1 に答える 1

4

このremoveLastObjectメソッドは、メモリからではなく、配列からオブジェクトを削除します。配列からオブジェクトを削除する前に、オブジェクトをローカル変数に割り当てます。ARCでコンパイルする場合、オブジェクトを指すローカル変数には、暗黙のライフタイム修飾子があり__strongます。

配列からオブジェクトを削除する前にオブジェクトへの強い参照を追加するため、メソッドが一時的にオブジェクトの所有権を取得します。メソッドが値ではなくオブジェクト自体を返した場合でも、ARCはメソッドの最後にautoreleaseaの代わりに呼び出しを挿入するため、これは正しく機能します。release

于 2012-12-31T14:43:38.587 に答える