0

C ++では、次のようにします。

Object* obj1;
Object* obj2;
Object** targetObj;

void SetTargetToObj1()
{
    targetObj = &obj1;
}
void SetTargetToObj2()
{
    targetObj = &obj2;
}
void ValueChanged()
{
    //So if SetTargetToObj2() was called before ValueChanged() we 
    // would be changing some data on obj2
    (*targetObj)->ChangeSomeData();

    //or, we obj2 is null we could assign a new object to it via targetObj
    (*targetObject) = new Object();
    //now obj2 is pointing to our new object
}

NSObjects でこれと同じことを行う方法が obj-c にあるかどうか疑問に思っていますか?

4

2 に答える 2

8

ポインターへのポインターは、ARC ではそれほど単純ではありません。

たとえば、インスタンス変数を宣言すると、次のようになります。

NSObject *someObject;

あなたは暗黙的に宣言しています:

NSObject * __strong someObject;

つまり、強いポインタです。Strong は所有権修飾子の 1 つにすぎません。weak および autorelease 修飾子を使用することできます

コメントの例を次に示します。

NSDate **targetDate;

「明示的な所有権のない非 const 型 'NSDate *' へのポインター」というエラーが表示されます。これは、ポインターが参照しているポインターの所有資格を ARC が知る必要があるためです (ゆっくり読んでください! ;-))。つまり、ARC は代わりに次のように変数を入力するように求めています。

NSData * 'some ownership qualifer' * targetDate;

C の型優先規則をデコードすると、これは「NSDate への「所有権修飾子」ポインターへのポインター」になります。

エラーメッセージには「non-const」が含まれています。これは、ポインターからポインターへの書き込みに関するものであるためです。ARC は、ストアの処理方法を知る必要があります。

あなたの単純なケースでは、次のようにする必要があります。

NSObject *obj1;
NSObject *obj2;
NSObject * __strong * targetObj;

(*targetObj) = ...ARCは、メモリ管理のために何をすべきかを知っています。この場合、によって参照される変数の古い値を解放し、targetObj新しい参照をその変数に割り当てます。

重要な読み物は、自動参照カウントARC リリース ノートへの移行です。特にNSError、エラー パラメータを宣言する一般的なパターンがNSError **ARC でどのように処理されるかを説明しているため、後者を参照してください。

于 2012-08-31T22:31:01.903 に答える
1

あなたが持っているコードはすでに問題ありません。実際に obj-c オブジェクトの場合Object、この正確なコードが必要です。唯一の癖は、潜在的なメモリ管理の問題です (たとえばtargetObj、それが指しているものを保持する必要がありますか?)

于 2012-08-31T20:56:59.720 に答える