我一直都在寻找答案,而我所看到的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;
}
}
..但你不应该这样做。无论如何,这解决了这个问题。希望它可以帮助别人。