我刚刚在一些已经工作了数月的代码中注意到了这一点。虽然这让我很好奇,但我确信我们一直生活在借来的时间......
假设 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不是时间问题吗?!?
答案 0 :(得分:4)
我的猜测是你有activeItem = something
而不是self.activeItem = something
不同之处在于“自”点版本通过合成的mutator(setter)方法,该方法在分配给ivar之前执行保留。这假设您有一个合成方法或手动构造的方法,它可以完成属性所声称的方法。
它可能没有任何区别,因为您可能只是将其用作弱引用。如果你真的想要一个弱引用,你可能想要改变那个保留来分配和阅读弱引用的Objective-C约定。
(在这种情况下,看起来你正在使用activeItem
更像是某个东西的索引,而不是设计为“拥有”该对象的“容器”,这使得它成为弱引用的场景。是你想要的。)