【问题标题】:been having a little confusion about the retainCount of NSURLConnection对 NSURLConnection 的 retainCount 有点困惑
【发布时间】:2011-07-10 09:43:28
【问题描述】:

先看看这些代码:

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

原来它打印“aaaaaaaaaaaaa 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: 方法中发生了什么,有人知道吗?

【问题讨论】:

标签: iphone objective-c memory-management


【解决方案1】:

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

不要使用 retainCount 属性

这可能是 Apple 在 NSObject 中放入的最糟糕的东西,因为它的名字太好听了,它会让你误以为它实际上是有用的。

查看您之前链接到的问题 - Objective C NSString* property retain count oddity - 但请查找第二个答案,即评分最高的答案。

【讨论】:

【解决方案2】:

这里一切都很好:NSURLConnection 必须保留自己以确保它可以将数据传递给委托(并且不能释放它)。如果没有委托,则没有人会监听该连接,也没有理由执行任何操作,因此它不会保留自己。 Connection 之后会自行释放:

-(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.

【讨论】:

  • 所以你会告诉我为什么[NSNumber numberWithInt:1] 的retainCount 为7 而[NSNumber numberWithInt:2] 的r​​etainCount 为3,以及我可以用这些信息做什么。
  • @fluchtpunkt 的原因与 NSURLConnection 相同:您不知道 [NSNumber numberWithInt:1] 在 iOS 内部调用了多少次。没有理由在内存中保存 7 个 NSNumber=1 的精确副本,因此仅保留此值。顺便说一句:我在一个项目中的保留数是 9,而在另一个项目中是 11。
  • 这就是retainCount信息完全没用的原因。它可以有任意值。
  • 例如 [[NSNumber numberWithInt:100] retainCount] 返回 1 证明了我的想法(也许对你来说数字不同)。
  • @fluchtpunkt 好吧,应该假设我不太依赖它,但是对于从 NSObject 继承的自定义对象,这个值是精确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 2013-06-19
  • 2013-11-14
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
相关资源
最近更新 更多