关于NSURLConnection的retainCount有点混乱

时间:2011-03-07 14:32:35

标签: iphone objective-c memory-management

首先看看这些代码:

NSURL *url = [[NSURL alloc] initWithString:@"lasdhfkjasf"];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
NSURLConnection *_conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
NSLog(@"aaaaaaaaa  %d", [_conn retainCount]);
[url release];
[request release];
[_conn release];

原来它打印“aaaaaaaaaaaaaa 2”,不应该是1吗?或者那里有某种异常。然后我改变它:

NSURL *url = [[NSURL alloc] initWithString:@"lasdhfkjasf"];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
NSURLConnection *_conn = [[NSURLConnection alloc] init];
NSLog(@"aaaaaaaaa  %d", [_conn retainCount]);
[url release];
[request release];
[_conn release];

我不知道发生在initWithRequest:delegate:方法中,有人知道吗?

2 个答案:

答案 0 :(得分:6)

虽然技术上并不是尼古拉所关联的问题的副本,但同样适用:

请勿使用retainCount属性

这可能是Apple给NSObject带来的最糟糕的事情,因为它的命名非常好,它让你觉得它实际上很有用。

查看之前与之关联的问题 - Objective C NSString* property retain count oddity - 但请查找第二个答案,评分最高的答案。

答案 1 :(得分:4)

这里的一切都绝对正常:NSURLConnection必须保留自己,以确保它可以向委托提供数据(并且这样做不能解除分配)。如果没有委托,则没有人监听该连接,并且没有理由执行任何操作,因此它不会保留自己。 Connection然后在以下情况下释放:

-(void) connectionDidFinishLoading:(NSURLConnection*) connection

OR

-(void) connection:(NSURLConnection*) connection didFailWithError:(NSError*) error

从你的例子:

. . .
NSURLConnection *_conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
. . .
[_conn release];

如果retainCount为1,则在[_conn release]之后,对象将立即被释放,并且根本不会加载。

对于所有人,他们说retainCount工作不正确:你只是不知道它是如何工作的。至于NSString'古怪':这不奇怪,这只是性能优化。 2147483647 retain count表示对象在内存中是常量(并在app终止时被删除)。这在编译期间已知值时完成:

NSString* str = @"12345"; //has 2147483647 retain count.