0

我对目标 c 很陌生。我已经为内存泄漏试验了一个方便的构造函数。

这是我的构造函数

+(Myobject * ) test{
    return [[self alloc] init];
}

我在 main.m 中用这段代码测试它

Myobject * __weak g = [Myobject test];
NSLog(@"%@",g);

我希望日志会显示 (null),因为构造函数中的指针在超出范围时死亡,并且 arc 会将该对象从内存中删除,因为没有强指针来保留它。只是弱指针。

但是在日志中它说一个对象还活着。在我现在的理解中,有一个强指针可以在构造方法中保留这个对象。所以它会永远存在。

那么我怎样才能摆脱那个指针呢?还是我错过了什么?

4

2 回答 2

4

您的test方法返回一个自动释放的对象。如果对象没有强引用,则会在当前自动释放池结束时销毁。你可以用

Myobject * __weak g;
@autoreleasepool {
    g = [Myobject test];
    NSLog(@"%@", g); // object still exists here (Correction: might still exist here, see Nikolaus Ruhe's comment)
}
NSLog(@"%@", g);  // should output "(null)"

由于 ARC 命名约定,如果将方法重命名为newTest. 在这种情况下,它会返回一个立即释放的保留对象。

确切的语义可以在Automatic Reference Counting中的“3.2.2. Retained return values”和“3.2.3. Unretained return values”部分中找到。

更正:正如 Nikolai Ruhe 正确指出的那样,不能保证返回的对象[Myobject test]在 autorelease 池中,编译器可以在优化期间删除 retain/release/autorelease 调用。

于 2012-12-10T08:52:03.743 回答
-1

是的,日志是正确的。正如我所看到的,即使 g 是一个弱引用,但它仍然指向已分配的类对象。此外, g 在这里仍然没有超出范围,因此不存在 ARC 释放它的问题。

于 2012-12-10T08:48:38.583 回答