【发布时间】:2011-08-20 05:51:24
【问题描述】:
当两个对象相互保留时,如何解决交叉保留情况?
考虑这个类结构:
容器.h
@interface Container : NSObject {
NSObject *child;
}
@property (nonatomic, retain) NSObject *child;
@end
容器.m
@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
}
因此,据我了解,保留计数应该显示正确的计数。但是我如何最终真正释放对象,因为在这段代码之后,这两个对象将留在内存中。
【问题讨论】:
-
setChild函数有什么作用?此外,A 和 B 是彼此的孩子似乎很奇怪。这什么时候有用? -
setChild 保留你给它的对象。我遇到过这种情况,不同类型的对象相互保留,但为了简单起见,我在这里的示例使用了相同的问题。但在现实生活中,这将是两种不同的类类型
标签: objective-c memory-management memory-leaks retaincount