0

以下は共有データの最適な構成ではありませんが、それでも機能しない理由を知りたい..

SharedClassこの例ではシングルトンではなく、通常のオブジェクトが渡されるだけです。

クラス A には ivar があります。

@property (nonatomic, retain) SharedClass*sharedClass;

クラス B と C の両方がこれを持っています:

@property (nonatomic,assign) SharedClass*sharedClass;

(この場合の「割り当て」は「保持」である可能性があります。この質問では問題にならないと思います)

クラス A は、次のように ivar を初期化しますinit

self.sharedClass=[[SharedClass new] autorelease]; // autorelease since it is retained

クラス B は、その init で ivar を処理しません。代わりに、クラス B はクラス A の init 内でインスタンス化され、次のように参照を渡します。

クラスAで

self.classB=[[ClassB new] autorelease]; self.classB.sharedClass=self.sharedClass; // passing a reference to same object; this is working as expected

これが私が理解していないことです。クラス C はクラス B でインスタンス化されinit、参照も渡されますが、これはクラス B がクラス A からオブジェクトを取得する前に発生しているため、一時的に null になります。

クラス B:

self.classC=[[ClassC new] autorelease]; self.classC.sharedClass=self.sharedClass; //self.sharedClass is currently nil, thus so is self.classC.sharedClass

クラス B がクラス A でインスタンス化され (したがって、クラス C もクラス B 内でインスタンス化され)、クラス A がクラス B に割り当てられた後、オブジェクトがクラス C でも使用可能にsharedClassなるように、これが波及するべきではありませんか? sharedClassnil だったからといって、nil ではない空間を指していたのですよね?

ただし、クラス A でさらにステップが処理される場合、クラス C は sharedClass のみを参照できることがわかりました。

self.classB=[[ClassB new] autorelease]; self.classB.sharedClass=self.sharedClass; self.classB.classC.sharedClass=self.sharedClass;//why is this necessary?

4

1 に答える 1

1

self.sharedClassnilあなたの割り当てにある場合

self.classC.sharedClass = self.sharedClass;

thenself.classC.sharedClassnilであり、後で何かを割り当ててもそれはself.sharedClass変わりません。

nil だったからといって、nil ではない空間を指していたのですよね?

それは間違ってnilいます。「null オブジェクト」であり、どこも指していません。

于 2012-09-11T11:21:14.060 に答える