Iphone 对重新计算NSURLConnection有点困惑

Iphone 对重新计算NSURLConnection有点困惑,iphone,objective-c,memory-management,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", [

首先看一下这些代码:

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];
原来它打印的是“aaaaaaaa2”,是不是应该是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:method中发生了什么,有人知道吗?

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

不要使用retainCount属性

这可能是苹果公司在NSObject中做过的最糟糕的事情,因为它的名字太好了,让你误以为它真的很有用


查看之前链接到的问题,但查找第二个答案,即评分最高的答案。

虽然从技术上讲不是尼古拉链接到的问题的重复,但同样适用于:

不要使用retainCount属性

这可能是苹果公司在NSObject中做过的最糟糕的事情,因为它的名字太好了,让你误以为它真的很有用


查看您以前链接到的问题--但请查找第二个答案,即评分最高的答案。

这里一切都完全正常:NSURLConnection必须保留自身,以确保它可以向代理传递数据(要做到这一点,它不得解除分配)。如果没有委托,那么就没有人监听该连接,也没有理由执行任何操作,因此它不会保留自己。然后,连接在以下情况下释放:

-(void) connectionDidFinishLoading:(NSURLConnection*) connection

从你的例子来看:

. . .
NSURLConnection *_conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
. . .
[_conn release];
如果retainCount为1,则在
[\u conn release]
之后,对象将立即被释放,并且根本不会加载

对于你们所有人来说,谁说重新计算工作不正确:你们只是不知道它是如何工作的。至于NSString'oddity':这不是奇怪,这只是性能优化。2147483647 retain count表示对象在内存中是常量(并且在应用程序终止时被删除)。当编译过程中已知值时,将执行此操作:

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

这里一切都是绝对正常的:NSURLConnection必须保持自身,以确保它可以向委托传递数据(要做到这一点,它不能被解除分配)。如果没有委托,那么就没有人监听该连接,也没有理由执行任何操作,因此它不会保留自己。然后,连接在以下情况下释放:

-(void) connectionDidFinishLoading:(NSURLConnection*) connection

从你的例子来看:

. . .
NSURLConnection *_conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
. . .
[_conn release];
如果retainCount为1,则在
[\u conn release]
之后,对象将立即被释放,并且根本不会加载

对于你们所有人来说,谁说重新计算工作不正确:你们只是不知道它是如何工作的。至于NSString'oddity':这不是奇怪,这只是性能优化。2147483647 retain count表示对象在内存中是常量(并且在应用程序终止时被删除)。当编译过程中已知值时,将执行此操作:

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

可能重复@lst的可能重复感谢您指出这一点。像这样的问题有很多()。请在上提交一个错误,以便弃用重新计数或更新文档。@lst感谢您指出这一点。像这样的问题有很多()。请在上提交一个错误,以便弃用重新计数或更新文档。因此,您将告诉我为什么
[NSNumber numberWithInt:1]
的重新计数为7,但
[NSNumber numberWithInt:2]
的重新计数为3,我可以用这些信息做些什么。@FluchPunkt的原因与NSURLConnection相同:您不知道在iOS内部调用了多少次[NSNumber numberWithInt:1]。没有理由在内存中保留NSNumber=1的7个精确副本,因此仅保留此值。顺便说一句:我在一个项目中的保留计数是9,在另一个项目中是11。这就是为什么保留计数信息是完全无用的。它可以有任意的值。例如[[NSNumber numberWithInt:100]retainCount]返回1,这证明了我的想法(也许对你来说,数字是不同的)。@FluchPunkt好吧,应该假设我不太依赖它,但是对于从NSObject继承的自定义对象,这个值是精确的。所以你就是那个会告诉我为什么
[NSNumber numberWithInt:1]
的重新计数为7,但
[NSNumber numberWithInt:2]
的重新计数为3,我可以如何处理此信息。@FluchPunkt的原因与NSURLConnection相同:您不知道有多少次[NSNumber numberWithInt:1]在iOS内部调用。没有理由在内存中保留NSNumber=1的7个精确副本,因此只保留此值。顺便说一句:我在一个项目中的保留计数为9,在另一个项目中的保留计数为11。这就是为什么retainCount信息完全无用。它可以具有任意值。例如[[NSNumber numberWithInt:100]retainCount]返回1,这证明了我的想法(可能对你来说,数字不同)。@fluchtpunkt好吧,应该假设我不太依赖它,但是对于从NSObject继承的自定义对象,这个值是精确的。