首先看看这些代码:
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:方法中,有人知道吗?
答案 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.