当一个对象设置为等于另一个时,它是一个自动释放

时间:2014-03-11 13:30:15

标签: objective-c object memory memory-management autorelease

我对Objective C中的内存管理有疑问。

这是代码......

SomeObject * objectA;
SomeObject * objectB;

objectA = [[SomeObject alloc] init];

objectB = objectA;

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

2 个答案:

答案 0 :(得分:0)

objectAobjectB都有一个强引用,所以如果它们都指向同一个对象,那么它们都将被解除分配,直到它们都被设置为{{ 1}}或者它们都超出了范围。这当然是假设ARC已启用。如果未启用ARC,则只有在其上调用nil时才会取消分配您的对象。

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

答案 1 :(得分:-1)

假设启用了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