[英]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.