以下不是共享数据的最佳组织,但我仍然想知道它为什么不起作用..
在这个例子中, SharedClass
不是单身,只是传递的常规对象。
A班有ivar:
@property (nonatomic, retain) SharedClass*sharedClass;
B类和C类都有:
@property (nonatomic,assign) SharedClass*sharedClass;
(在这种情况下“指定”可能是“保留”,我认为这个问题不重要)
A类在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类获取其对象之前发生的,所以它暂时为空,我期望这样:
B组:
self.classC=[[ClassC new] autorelease];
self.classC.sharedClass=self.sharedClass; //self.sharedClass is currently nil, thus so is self.classC.sharedClass
在类A中实例化类B(因此类C也在类B中实例化)并且类A将sharedClass
分配给类B时,不应该这样通过sharedClass
对象现在也可用于C类?仅仅因为它是零,它仍然指向一个现在不再为零的空间,对吧?
但是我发现如果在A类中处理了另一个步骤,C类只能引用sharedClass:
self.classB=[[ClassB new] autorelease];
self.classB.sharedClass=self.sharedClass;
self.classB.classC.sharedClass=self.sharedClass;//why is this necessary?
答案 0 :(得分:1)
如果您的作业self.sharedClass
为nil
self.classC.sharedClass = self.sharedClass;
然后self.classC.sharedClass
也是nil
,稍后为self.sharedClass
分配内容并不会改变这一点。
仅仅因为它是零,它仍然指向现在的空间 不再是,对吗?
这是错误的,nil
是一个“空对象”,并没有指向任何地方。