以下は共有データの最適な構成ではありませんが、それでも機能しない理由を知りたい..
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
なるように、これが波及するべきではありませんか? sharedClass
nil だったからといって、nil ではない空間を指していたのですよね?
ただし、クラス A でさらにステップが処理される場合、クラス C は sharedClass のみを参照できることがわかりました。
self.classB=[[ClassB new] autorelease];
self.classB.sharedClass=self.sharedClass;
self.classB.classC.sharedClass=self.sharedClass;//why is this necessary?