死后的物体寿命(保留计数= 0)

时间:2010-01-22 03:47:49

标签: iphone objective-c cocoa cocoa-touch

我刚刚在一些已经工作了数月的代码中注意到了这一点。虽然这让我很好奇,但我确信我们一直生活在借来的时间......

假设 activeItem

@property (nonatomic, retain) ItemView *activeItem;

我们在touchesEnded中有条件:

if (CGRectContainsPoint(dropRect, touchLocation)) {
    ItemView *replacementItem = [[ItemView alloc] initWithFrame:frame];

    [newItems replaceObjectAtIndex:[newItems indexOfObject:activeItem] withObject:replacementItem];

    [self addSubview:replacementItem];
    [controller.view.subView addItem:activeItem];
    [replacementItem goCenter];
    [replacementItem release];
}

唯一保留 activeItem 的是NSArray,newItems。我应该在致电replaceObjectAtIndex之前保留它,然后在我发布replacementItem时将其释放吗?另一种方式?

似乎工作正常但是EXC_BAD_ACCESS不是时间问题吗?!?

1 个答案:

答案 0 :(得分:4)

我的猜测是你有activeItem = something而不是self.activeItem = something

不同之处在于“自”点版本通过合成的mutator(setter)方法,该方法在分配给ivar之前执行保留。这假设您有一个合成方法或手动构造的方法,它可以完成属性所声称的方法。

它可能没有任何区别,因为您可能只是将其用作弱引用。如果你真的想要一个弱引用,你可能想要改变那个保留来分配和阅读弱引用的Objective-C约定。

(在这种情况下,看起来你正在使用activeItem更像是某个东西的索引,而不是设计为“拥有”该对象的“容器”,这使得它成为弱引用的场景。是你想要的。)