Objective c 当一个对象被设置为另一个对象时,它是自动释放的吗

Objective c 当一个对象被设置为另一个对象时,它是自动释放的吗,objective-c,object,memory,memory-management,autorelease,Objective C,Object,Memory,Memory Management,Autorelease,我有一个关于目标C中内存管理的问题 这是代码 SomeObject * objectA; SomeObject * objectB; objectA = [[SomeObject alloc] init]; objectB = objectA; 从内存的角度来看,对象B是自动释放对象吗?它弱/强吗?它只是指向对象A,如果对象A被释放,它将变为零吗?假设ARC被启用,并且objectA和objectB都是局部变量,那么它们都充当强指针。因此,将objectA设置为nil对objectB或底层

我有一个关于目标C中内存管理的问题

这是代码

SomeObject * objectA;
SomeObject * objectB;

objectA = [[SomeObject alloc] init];

objectB = objectA;

从内存的角度来看,对象B是自动释放对象吗?它弱/强吗?它只是指向对象A,如果对象A被释放,它将变为零吗?

假设ARC被启用,并且objectA和objectB都是局部变量,那么它们都充当强指针。因此,将objectA设置为nil对objectB或底层对象没有影响。将objectA和objectB设置为nil将释放基础对象。此外,当objectA和objectB超出范围时,底层对象将被释放

此代码

@interface SomeClass : NSObject
@end

@implementation SomeClass
- (void)dealloc
{
    NSLog( @"dealloc underlying object" );
}
@end

- (void)test
{
    SomeClass *objectA;
    SomeClass *objectB;

    objectA = [[SomeClass alloc]init];
    objectB = objectA;
    NSLog( @"objectA=%p objectB=%p", objectA, objectB );

    objectA = nil;
    NSLog( @"objectA=%p objectB=%p", objectA, objectB );

    NSLog( @"end of test method" );
}
生成此输出

objectA=0x7a4d800 objectB=0x7a4d800
objectA=0x0 objectB=0x7a4d800
end of test method
dealloc underlying object
objectA和objectB都有一个强引用,因此如果它们都指向同一个对象,那么在它们都设置为nil或都超出范围之前,它不会被释放。当然,这是假设启用了ARC。如果未启用ARC,则只有在调用对象上的release时,对象才会被释放


现在,在ARC下,如果您只希望其中一个具有对对象的强引用,那么您可以将_弱限定符放在其中一个变量前面。当然,在您的示例中,如果将objectA设为弱对象,则会导致立即释放对象,因此两个指针都将保持为零。

objectB不是对象。这是一个参考,如果ObjectA被释放,那么objectB为零?我不确定你是否在谈论ARC?我正在试图理解逻辑。让我们假设我控制了对象的释放,并在使objectB=objectA后释放objectA。好的,所以当objectB=objectA?@user1539603时,引用计数将变为2。您通常不应该关心引用计数是多少,但是的,当您这样做时,它应该增加它。请记住,苹果公司关于retainCount方法的文档中说不要使用它,并且出于多种原因,它在调试内存管理问题方面没有任何价值。谢谢您的回答!我理解ARC管理这一点,我只是想完全理解方法。@user1539603我希望我的回答能有所帮助将其中一个设置为nil将释放它。这一说法显然是错误的,并显示出对引用计数概念的深刻理解。在所有强引用消失后,它将被释放。从技术上讲,这句话是正确的,但考虑到OP问题中的代码片段,这句话偏离了主题。我认为是你对这句话缺乏深刻的理解。在ARC中设置_强对象指针将释放以前的值并保留新值。