Iphone 对象死亡后的生存期(保留计数=0)

Iphone 对象死亡后的生存期(保留计数=0),iphone,objective-c,cocoa,cocoa-touch,Iphone,Objective C,Cocoa,Cocoa Touch,我只是在一些已经运行了几个月的代码中注意到了这一点。虽然这让我好奇,但我确信我们一直生活在借来的时间里 假设活动项: @property (nonatomic, retain) ItemView *activeItem; 我们有这样的条件接触: if (CGRectContainsPoint(dropRect, touchLocation)) { ItemView *replacementItem = [[ItemView alloc] initWithFrame:frame];

我只是在一些已经运行了几个月的代码中注意到了这一点。虽然这让我好奇,但我确信我们一直生活在借来的时间里

假设活动项

@property (nonatomic, retain) ItemView *activeItem;
我们有这样的条件接触:

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\u BAD\u访问是否只是时间问题

我猜你在某处有
activeItem=something
而不是
self.activeItem=something

不同之处在于“self”dot版本通过合成的mutator(setter)方法,该方法将在分配给ivar之前执行retain。这假设您有一个合成的方法或一个手动构造的方法,可以执行属性声明的操作

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


(在本例中,您使用的
activeItem
更像是对某个对象的索引,而不是设计用于“拥有”对象的“容器”,这使得它成为弱引用的场景,如果这正是您想要的。)

我猜你在某处有了
activeItem=something
而不是
self.activeItem=something

不同之处在于“self”dot版本通过合成的mutator(setter)方法,该方法将在分配给ivar之前执行retain。这假设您有一个合成的方法或一个手动构造的方法,可以执行属性声明的操作

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


(在本例中,您使用的是
activeItem
更像是对某个对象的索引,而不是设计用于“拥有”对象的“容器”,这使得它成为弱引用的场景,如果这正是您想要的。)

解决了这个问题……您的帖子让我思考了一下。它仍然被视图保留着…而且,iPhone上没有弱引用(因为也没有GC…)Kendall Helmstetter Gelner:你可以在没有GC的情况下拥有弱引用(即非保留引用)。
\uuuu-weak
关键字仅用于GC。当然,使用assign属性-但我认为原始海报指的是\uuuu-weak,因为该术语通常仅与\uuuu-weak结合使用(至少我从未听说它用于Objective-C)。我想我误解了他的观点……我不是说软弱。我从来没有在Objective-C中使用过GC,因为我只做过cocoa touch,没有cocoa,开发,但实际上,任何时候你有一个不应该“拥有”对象并管理其引用计数的引用,它都可以被视为弱引用。只是垃圾收集器必须被特别告知。对于非GC弱引用来说,合理的做法似乎是声明一个属性,如果引用不再有效,则该属性将返回nil。它仍然被视图保留着…而且,iPhone上没有弱引用(因为也没有GC…)Kendall Helmstetter Gelner:你可以在没有GC的情况下拥有弱引用(即非保留引用)。
\uuuu-weak
关键字仅用于GC。当然,使用assign属性-但我认为原始海报指的是\uuuu-weak,因为该术语通常仅与\uuuu-weak结合使用(至少我从未听说它用于Objective-C)。我想我误解了他的观点……我不是说软弱。我从来没有在Objective-C中使用过GC,因为我只做过cocoa touch,没有cocoa,开发,但实际上,任何时候你有一个不应该“拥有”对象并管理其引用计数的引用,它都可以被视为弱引用。只是垃圾收集器必须被特别告知。对于非GC弱引用来说,合理的做法似乎是声明一个具有访问器的属性,如果引用不再有效,该访问器将返回nil。