交叉保留麻烦

| 当两个对象相互保留时,如何解决交叉保留的情况? 考虑以下类结构: 容器.h
@interface Container : NSObject {
    NSObject *child;
}

@property (nonatomic, retain) NSObject *child;
@end
货柜
@implementation Container

@synthesize child;

- (void)dealloc {
    [child release];
    [super dealloc];
}

@end
然后在测试内存保留计数时:
- (void)testDoubleRetain {
    Container *A = [[Container alloc] init];
    Container *B = [[Container alloc] init];

    NSLog(@\"A retainCount: %d\", [A retainCount]);//returns 1
    NSLog(@\"B retainCount: %d\", [B retainCount]);//returns 1
    [A setChild:B];
    [B setChild:A];

    NSLog(@\"A retainCount: %d\", [A retainCount]);//returns 2
    NSLog(@\"B retainCount: %d\", [B retainCount]);//returns 2

    [A release];
    [B release];

    NSLog(@\"A retainCount: %d\", [A retainCount]);//returns 1
    NSLog(@\"B retainCount: %d\", [B retainCount]);//returns 1
}
因此,据我了解,保留数应该显示正确的数。但是实际上我该如何最终释放对象,因为在这段代码之后,这两个对象将保留在内存中。     
已邀请:
一个简单的解决方法可能是在释放对象本身之前将孩子设为零:
A.child = nil;
[A release];
但是为了避免出现问题,可能值得重新考虑一下通用程序的结构,这样就不需要两个对象相互保留(可能是它们之间的关系允许使用'assign'属性而不是'retain \'并且您可以确保它们不会通过其他方式过早地被释放,例如,将它们全部放入某个全局容器中-这些都将取决于您的实际环境)     
首先,不要使用retainCount。它没有按照您的想法做。 此处要做的正常事情是让孩子或容器不保留另一个,这会破坏周期。如果无法实现,请提供一个必须显式调用的函数,以告诉容器您已完成此操作,此时它将释放子级。     

要回复问题请先登录注册