【问题标题】:Is an object an autorelease when it's set equal to another当对象设置为等于另一个对象时,它是自动释放的吗
【发布时间】:2014-04-15 03:37:31
【问题描述】:

我有一个关于 Objective C 内存管理的问题。

这里是代码...

SomeObject * objectA;
SomeObject * objectB;

objectA = [[SomeObject alloc] init];

objectB = objectA;

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

【问题讨论】:

  • objectB 不是对象。这是一个参考
  • 那么如果释放了 ObjectA 那么 objectB 是 nil 吗?
  • 我不确定你说的是不是 ARC?
  • 我试图理解逻辑。假设我可以控制释放对象,并且在使 objectB = objectA 之后释放 objectA。

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


【解决方案1】:

objectAobjectB 都将具有强引用,因此如果它们都指向同一个对象,那么直到它们都设置为 nil 或它们都设置为超出范围。这当然是假设启用了 ARC。如果 ARC 未启用,那么只有在您调用 release 时,您的对象才会被释放。

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

【讨论】:

  • 好的,所以当objectB = objectA时引用计数会变为2?
  • @user1539603 你通常不应该关心引用计数是多少,但是是的,当你这样做时它应该增加它。请记住,Apple 的 retainCount 方法文档说不要使用它,并且出于多种原因,它在调试内存管理问题时没有任何价值。
  • 感谢您的回答!我知道 ARC 可以做到这一点,我只是想完全了解方法。
  • @user1539603 我希望我的回答有所帮助。 :)
【解决方案2】:

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

【讨论】:

  • "将任何一个设置为 nil 都会释放它。"这种说法显然是错误的,并且表明对引用计数的概念缺乏深刻的理解。 “在所有强引用消失后,它将被释放。”该声明在技术上是正确的,但考虑到 OP 问题中的代码 sn-p,这是题外话。
  • 我觉得是你的理解力严重不足。在 ARC 中设置 __strong 对象指针将释放以前的值并保留新值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
相关资源
最近更新 更多