【发布时间】:2012-04-27 09:14:15
【问题描述】:
我的内存管理和线程知识非常有限,所以我可能遗漏了一些非常基本的东西。我已经找到了解决这个问题的方法,但它真的让我很困扰,因为我看不到正在发生的事情。
我有一个类发出两个异步 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 中添加“”),则保留变量。如果我删除它,它就会被释放。这对我来说毫无意义。
我尝试用@propterty (nonatomic, retain) 声明sponsorUrl;我试过静态声明sponsorUrl;我试过在我设置它的地方添加[sponsorUrl retain],但这并没有什么不同。唯一有效的是在发出第二个请求之前“触摸”变量。
我错过了什么?
【问题讨论】:
-
你试过 [alloc init];在赞助商网址上。我有一个类似的问题,这解决了它......试试吧
标签: iphone objective-c memory-management