Objective-C是否引用指定的字段或创建新实例
例如,假设我对Objective-C是否引用指定的字段或创建新实例,objective-c,memory,memory-management,reference,field,Objective C,Memory,Memory Management,Reference,Field,例如,假设我对MyClass有以下定义: @interface MyClass { ClassWithBigMemoryUsage* cwbmu; } -(void) setClassWithBigMemoryUsage:(ClassWithBigMemoryUsage*) assignment; // where cwbmu = assignment; 如果我将myClassInstance创建为MyClass实例,并将cwbmuInstance创建为ClassWithBigMem
MyClass
有以下定义:
@interface MyClass
{
ClassWithBigMemoryUsage* cwbmu;
}
-(void) setClassWithBigMemoryUsage:(ClassWithBigMemoryUsage*) assignment; // where cwbmu = assignment;
如果我将
myClassInstance
创建为MyClass
实例,并将cwbmuInstance
创建为ClassWithBigMemorySage
实例,然后调用[myClassInstance SetClassWithBigMemorySage:cwbmuInstance]
将cwbmuInstance
设置为myClassInstance
的字段,这会为myClassInstance
创建对象ClassWithBigMemorySage
的新实例(意味着额外分配的内存),还是只将myClassInstance
的字段引用到cwbmuInstance
(意味着没有为对象分配额外内存)
但是,当方法实际执行赋值时,是否复制对象显然取决于setter方法的实现。如果您只是这样做:
cwbmu = assignment;
只需设置指针值,不进行复制。当然,由于它是一个对象,您可能应该通过执行以下操作来保留它:
[cwbmu autorelease];
cwbmu = [assignment retain];
但结果是一样的。真正可靠地复制Objective-C实例的唯一方法是显式地向其发送copy
消息:
[cwbmu autorelease];
cwbmu = [assignment copy];
这只适用于符合NSCopying
协议的类
最后一点,如果您使用@property
声明以及@synthesis
'd方法,您可以指定您想要的行为。使用以下三种方式声明属性将分别使用所述三种方式:
@property (assign) ClassWithBigMemoryUsage* cwbmu;
@property (retain) ClassWithBigMemoryUsage* cwbmu;
@property (copy) ClassWithBigMemoryUsage* cwbmu;
还要注意的是,在ARC下,这种内存管理是为您完成的,所以您不能直接控制它。相反,您可以使用弱
选项(而不是分配
)或强
选项(而不是保留
),并且即使旧名称仍然有效,新名称也会让您更清楚地了解实际操作。copy
选项在ARC下仍然有效
最后,如果您使用的是ARC,但没有使用
@property
,那么默认情况下,实例变量被管理为strong
。您可以通过在ivar声明前加上\uu-weak
来改变这一点。但是,并非所有体系结构都支持弱
,在这种情况下,可以使用\uuuu unsafe\u unrepaired
,但在后一种情况下,解除分配的对象指针不会归零(设置为nil
),使用\uu弱
时将归零,谢谢。我也在想同样的事情,但我只需要确认一下。我对Objective-C相当陌生,所以我对自己的推测有双重怀疑。哈哈。你能链接到这方面的参考资料吗?我找不到。谢谢。@brain56在一个简单的层次上,这些规则中的大多数与普通C中的规则相同。直接指针赋值复制指针,而不是那些指针引用的值。如果您来自非C背景(正如我第一次学习Obj-C时所知道的那样),请考虑对象所有权的强引用和弱引用。在Objective-C内存管理中,您可能犯的最大错误是对内存管理考虑太多。这一切都取决于。SetClassWithBigMemorySage实现了strong
/保留
语义还是复制
语义?我不知道该怎么回答,@HotLicks。呵呵。很抱歉请您清除strong
/retain
或copy
语义,好吗?您是在处理一个属性吗?如果是,如何申报?