因此,根据我的理解,这是非常标准的内存管理:
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 :(得分: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不会产生任何影响。