当一个实例在ARC下解除分配时,它的所有强指针都会自动设置为nil吗?

时间:2014-10-04 22:54:10

标签: ios automatic-ref-counting null

我一直都在寻找答案,而我所看到的ARC的所有教程都没有明确说明:

我正在使用ARC。如果一个实例被释放(因为它的最后一个强指针被设置为nil),那么该实例的强指针是否也会自动设置为nil和/或它指向要解除分配的任何对象?

例如:我有两个类,Foo和Bar,我有一个Foo,myFoo的实例。

在myFoo中,我创建了一个Bar实例(默认情况下很强)。

Bar *myBar = [Bar new]; 

现在,无论拥有myFoo的任何实例,我都将其解除分配。

myFoo = nil;

myBar会自动变为零(或者更确切地说,它的保留计数会减少)吗?

修改

我已将其缩小到此代码。我正在使用精灵套件。此代码位于我的Play视图所拥有的实例中。

// tick marks every 20 pix.
for (long h=0; h<20000; h+=20) {

    SKShapeNode *line = [SKShapeNode node];
    CGMutablePathRef pathToDraw = CGPathCreateMutable();
    CGPathMoveToPoint(pathToDraw, NULL, 0, h+yOffset+5);
    CGPathAddLineToPoint(pathToDraw, NULL, 10, h+yOffset+5);
    line.path = pathToDraw;
    line.lineWidth = 1;
    [line setStrokeColor:[UIColor grayColor]];
    [rulerContainer addChild:line];
    CGPathRelease(pathToDraw);
}

(我知道我应该懒得加载刻度线;这会将其中的1000个全部放在一起,但是它运行得很快,所以认为它没问题;而且它们应该被解除分配。)

当我注释掉[rulerContainer addChild:line]时,分配问题几乎为零。 当该行进入时,每次返回菜单视图时都会增加5MB。

为什么在场景和视图控制器被解除分配后线路会挂起来?

更新

我根据SO上的另一个帖子将此添加到我的VC ...

- (void) dealloc
{
    if (self.scene != nil)
    {
        [self.scene removeAllActions];
        [self.scene removeAllChildren];

        self.scene = nil;

        [self.skView presentScene:nil];

        self.skView = nil;
    }
}

..但你不应该这样做。无论如何,这解决了这个问题。希望它可以帮助别人。

0 个答案:

没有答案