2011-09-27 54 views
1

所以,这是非常标准的内存管理,从我的理解:用相同的对象初始化几个相同类型的ivars?

ClassName *temp=[[ClassName alloc] init]; 
self.ivar=temp; 
[temp release]; 

这是为了避免只是在做这创造了内存泄漏:

self.ivar=[[ClassName alloc] init]; 

酷。但是,假设我有几个基于ClassName的ivars?这样行:

ClassName *temp=[[ClassName alloc] init]; 
self.ivar=temp; 
self.othervar=temp; 
self.anothervar=temp; 
[temp release]; 

他们会全部是操作同一个对象,最终,尽管我希望他们有ClassName不同的实例?我认为这样做的结果可能取决于ivars是否创建为retain vs copy?假设它们设置为retain,这样可以吗?

+0

+1确认'self.ivar = [[ClassName alloc] init];'创建泄漏 – albertamg

回答

2

尽管我希望它们有不同的ClassName实例,它们是否都会操纵同一个对象?

默认期望是“是的,他们会引用同一个对象,因为这是一个引用计数系统。”

我认为这个结果可能取决于ivars是否被创建为保留vs复制?

力量,但完全。如果财产被宣布为copy并且类型采用NSCopying,那应该是所有需要的。如果你自己实现setter(通常是合成的属性),你的实现中必须使用copy

假设他们被设置为保留,这会好吗?

然后它们都会引用相同的实例。这是否是您的程序的正确语义取决于您如何表现它的行为。在本例中,您声明“我希望他们有不同的ClassName实例”,因此您需要为每个目标创建一个唯一实例(直接或通过copy,如ClassName采用NSCopying)。

0

如果属性全部为retain那么您将按照您的设想将相同的实例存储三次。如果你想要不同的实例,并且你想使用retain,那么你需要创建三个不同的实例。 copy将创建一个副本,但每当您将任何内容设置为属性时都会执行此操作,这可能不是您想要的行为。

0

在您的例子中的所有对象将指向/操纵相同的对象实例,除非它们是

拷贝/ mutableCopy

或符合NSCopying协议的任何其它类型。

保留将不会影响除递增已分配对象的retainCount值。

相关问题