使用相同的对象初始化几个相同类型的ivars?

时间:2011-09-27 13:34:56

标签: objective-c

因此,根据我的理解,这是非常标准的内存管理:

 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,这可以吗?

3 个答案:

答案 0 :(得分:2)

  

即使我希望他们拥有不同的ClassName实例,他们最终都会操纵同一个对象吗?

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

  

我认为这可能取决于是否将ivars创建为retain vs copy?

可能,但完全。如果属性声明为copy且类型采用NSCopying,则应该只需要它。如果您自己实现了setter(通常是合成属性),那么在实现中必须copy

  

假设他们被设置为保留,这可以吗?

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

  

拷贝/ mutableCopy

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

除了递增已分配对象的retainCount之外,

retain不会产生任何影响。