我对Objective C中的内存管理有疑问。
这是代码......
SomeObject * objectA;
SomeObject * objectB;
objectA = [[SomeObject alloc] init];
objectB = objectA;
从内存的角度来看,对象B是自动释放对象吗?它弱/强吗?它只是指向对象A,如果对象A被释放则会变为零吗?
答案 0 :(得分:0)
objectA
和objectB
都有一个强引用,所以如果它们都指向同一个对象,那么它们都将被解除分配,直到它们都被设置为{{ 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