我的内存管理和线程知识非常有限,所以我可能遗漏了一些非常基本的东西。我已经找到了解决这个问题的方法,但它真的非常困扰我,我看不到正在发生的事情。
我有一个类发出两个异步 HTTP 请求,一个用于 XML 配置文件,另一个用于图像。因为在同一个类中有两个异步请求,所以我重用了相同的NSURLConnectionDelegate
方法(也许是因素)。我首先异步获取配置文件并提取两个 url,存储为sponsorImage
和sponsorUrl
. 然后我使用 的值sponsorImage
来异步获取图像数据。不过,我发现,在我获得图像之后(在第二个异步事件完成之后),sponsorUrl
已经发布了。
我意外地发现,sponsorUrl
如果我在创建图像请求的方法中“对它做某事”,我可以防止被释放——我的意思是“做某事”。基本上,我的代码如下所示:
- (void) loadImage
{
sponsorUrl = [sponsorUrl stringByAppendingString:@""];
NSURL *url = [NSURL URLWithString:sponsorImage];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setValue:dateString forHTTPHeaderField:@"If-Modified-Since"];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];
[connection release];
}
如果我删除此方法的第一行(我在 url 中添加“”),则保留该变量。如果我删除它,它就会被释放。这对我来说毫无意义。
我试过sponsorUrl
用@propterty (nonatomic, retain)
;声明 我试过sponsorUrl
静态声明;我已经尝试添加[sponsorUrl retain]
我设置它的位置,但它没有任何区别。唯一有效的是在发出第二个请求之前“触摸”变量。
我错过了什么?