1

例如说我有以下定义MyClass

@interface MyClass
{
    ClassWithBigMemoryUsage* cwbmu;
}

-(void) setClassWithBigMemoryUsage:(ClassWithBigMemoryUsage*) assignment; // where cwbmu = assignment;

如果我将a创建myClassInstanceMyClass实例和实例,然后调用设置为为对象分配了额外的内存)。cwbmuInstanceClassWithBigMemoryUsage[myClassInstance setClassWithBigMemoryUsage:cwbmuInstance]cwbmuInstancemyClassInstanceClassWithBigMemoryUsagemyClassInstancemyClassInstancecwbmuInstance

4

1 回答 1

3

所有 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.

于 2013-02-15T02:13:54.917 回答