Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C是否引用指定的字段或创建新实例_Objective C_Memory_Memory Management_Reference_Field - Fatal编程技术网

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
语义,好吗?您是在处理一个属性吗?如果是,如何申报?