我对目标c非常新。 我已经为内存泄漏实验了一个方便的构造函数。
这是我的构造函数
+(Myobject * ) test{
return [[self alloc] init];
}
我在main.m
中使用此代码对其进行测试Myobject * __weak g = [Myobject test];
NSLog(@"%@",g);
我希望日志会说(null)因为构造函数中的指针在超出范围时会死亡,并且arc会将此对象从内存中删除,因为没有强指针可以保留它。 只是弱指针。
但是在日志中它说的是一个对象仍然活着的东西。 在我的理解中,现在有一个强大的指针,它在构造函数方法中保留了这个对象。所以它将永远存在。
那我怎么能摆脱那个指针呢? 或者我错过了什么?
答案 0 :(得分: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。保留的返回值”和“3.2.3。未保留的返回值”部分中找到。
更正:正如Nikolai Ruhe正确指出的那样,[Myobject test]
返回的对象不在保证中,而是在自动释放池中,编译器可以删除优化期间保留/释放/自动释放调用。
答案 1 :(得分:-1)
是的,日志是正确的。正如我所见,即使g是一个弱引用,但它仍然指向一个已分配的类对象。此外,g仍然没有超出范围,因此不存在ARC解除分配的问题。