所有 Objective-C 对象都是指针(因此是*
in ClassWithBigMemoryUsage *
),因此对象将通过引用传递,您不必担心在传递时它会被复制。
但是,当方法实际执行赋值时是否复制对象显然取决于您的 setter 方法的实现。如果你这样做:
cwbmu = assignment;
您只需设置指针值,不进行复制。当然,既然它是一个对象,你可能应该保留它,方法是:
[cwbmu autorelease];
cwbmu = [assignment retain];
但结果是一样的。真正可靠地复制 Objective-C 实例的唯一方法是显式发送copy
消息:
[cwbmu autorelease];
cwbmu = [assignment copy];
这仅适用于符合NSCopying
协议的类。
最后一点,如果您使用@property
声明以及@synthesize
'd 方法,您可以指定您想要的这些行为中的哪一个。以下三种方式声明一个属性,将分别使用所描述的三种方式:
@property (assign) ClassWithBigMemoryUsage* cwbmu;
@property (retain) ClassWithBigMemoryUsage* cwbmu;
@property (copy) ClassWithBigMemoryUsage* cwbmu;
另请注意,在ARC下,这个内存管理是为你完成的,所以你不能直接控制它。相反,您将使用weak
选项(而不是assign
)或strong
选项(而不是retain
),即使旧名称仍然有效,新名称也可以更清楚地说明您实际在做什么。该copy
选项在 ARC 下仍然有效。
最后,如果您使用 ARC,但不使用@property
,则默认情况下,实例变量被管理为strong
. __weak
您可以通过添加到他们的 ivar 声明来更改此设置。但是,weak
并非所有体系结构都支持,在这种情况下__unsafe_unretained
可以使用,但在后一种情况下,释放的对象指针将不会被清零(设置为nil
),它们将在使用__weak
.