繁体   English   中英

对NSURLConnection的keepCount有一些困惑

[英]been having a little confusion about the retainCount of NSURLConnection

首先看一下这些代码:

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];

原来它会打印“ aaaaaaaaaaaaaaa 2”,不是吗?或者那里有某种异常。然后我将其更改:

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:方法中发生了什么,有人知道吗?

从技术上讲,虽然不是Nikolai所链接问题的重复,但同样适用:

不要使用keepCount属性

这可能是Apple曾经将NSObject放入最糟糕的东西的原因,因为它的名字如此漂亮,它使您误以为它实际上是有用的。

查看您之前链接到的问题-Objective C NSString *属性保留计数奇数 -但寻找第二个答案,即评分最高的答案。

一切在这里都是绝对可以的:NSURLConnection必须保留自身,以确保它可以将数据传递给委托(并且这样做一定不能将其释放)。 如果没有委托,则没有人会监听该连接,也没有理由执行任何操作,因此它不会保留自身。 连接然后在以下情况下释放自身:

-(void) connectionDidFinishLoading:(NSURLConnection*) connection

要么

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

从您的示例:

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

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

对于所有人来说,retainCount的工作方式不正确:您只是不知道它是如何工作的。 至于NSString'oddity':这不是奇怪,这只是性能优化。 2147483647保留计数表示对象在内存中是恒定的(当应用终止时将被删除)。 当在编译期间知道该值时,将完成此操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM