在多个类之间共享对多个ivars的同一对象的引用

时间:2012-09-11 10:58:59

标签: objective-c

以下不是共享数据的最佳组织,但我仍然想知道它为什么不起作用..

在这个例子中,

SharedClass不是单身,只是传递的常规对象。

A班有ivar:

@property (nonatomic, retain) SharedClass*sharedClass;

B类和C类都有:

@property (nonatomic,assign) SharedClass*sharedClass;

(在这种情况下“指定”可能是“保留”,我认为这个问题不重要)

A类在init

中初始化ivar

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?

1 个答案:

答案 0 :(得分:1)

如果您的作业self.sharedClassnil

self.classC.sharedClass = self.sharedClass;

然后self.classC.sharedClass也是nil,稍后为self.sharedClass分配内容并不会改变这一点。

  

仅仅因为它是零,它仍然指向现在的空间   不再是,对吗?

这是错误的,nil是一个“空对象”,并没有指向任何地方。