【发布时间】:2011-02-24 03:50:33
【问题描述】:
我的应用程序似乎有 4 次内存泄漏(在设备上,正在运行的仪器上)。
内存泄漏似乎来自这段代码:
NSURL *url = [self getUrl:destination];
[destination release];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setHTTPMethod:@"GET"];
[request addValue:@"application/json" forHTTPHeaderField:@"content-type"];
NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
[request release];
[connection release];
编辑:为 getUrl 添加代码
- (NSURL *)getUrl:(NSString *)actionUrl
{
NSString *rawUri = [[NSString alloc]initWithFormat:@"%@/%@", kBaseUrl, actionUrl];
NSURL *url = [[[NSURL alloc] initWithString:rawUri] autorelease];
[rawUri release];
return url;
}
据我所知,我正在释放我的所有对象,但它仍然显示这是 4 次内存泄漏的来源。
这是在运行 3.1.3 的设备上
在您的应用程序中出现一些内存泄漏是否可以接受,还是必须全部解决?
编辑:我已将 autorelease 添加到 getUrl。但是它仍然会出现内存泄漏
EDIT2:行为相当奇怪。我启动应用程序并点击一次调用的按钮。发现4个泄漏点。我按回并再次按下按钮,并继续这样做几次,仍然只有 4 次泄漏。但是,如果我等待几秒钟,然后再按几次增益按钮,就会发现 9 个泄漏。这不是一个小的 128 字节泄漏,但此时它是 1.61KB。
EDIT3:这里是connectionDidFinishLoading
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
SBJSON *jsonParser = [[SBJSON alloc] init];
NSString *jsonString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
[receivedData setLength:0];
[receivedData release];
[self.delegate dataReceived:[jsonParser objectWithString:jsonString]]; // See method below
[jsonParser release];
[jsonString release];
}
委托获取数据,然后对其进行转换(并在构建产品后将其传递给另一个委托)
- (void)dataReceived:(id)data
{
NSMutableArray *myObjects = [[NSMutableArray alloc]init];
ObjectFactory *objectFactory = [[ObjectFactory alloc]init];
// Only one object
if ([data isKindOfClass:[NSDictionary class]])
{
Object *object = [objectFactory buildObject:data];
[myObjects addObject:object];
[object release];
}
// Multiple objects
if ([data isKindOfClass:[NSArray class]])
{
for (NSDictionary *objectSrc in data)
{
Object *object = [objectFactory buildObject:post];
[myObjects addObject:object];
[object release];
}
}
[objectFactory release];
[self.delegate objectsReceived:myObjects];
}
EDIT4: 我确实注意到包含 NSUrlConnection 的对象“ConnectionObject”似乎从未被释放。
我在 dealloc 上放置了一个断点,它调用 [connection release] 这个 dealloc 永远不会被调用。除了这个之外,所有的 deallocs 都会被调用。 我在“connectionDidFinishLoading”调用中尝试了[连接取消],看看是否有帮助,但根本没有。
这对我来说肯定是个谜......
【问题讨论】:
-
如果您的内存泄漏值 1.61K,我会立即开始怀疑您正在泄漏连接下载的一些数据?
-
您能否发布更多关于您所看到的泄漏的详细信息以及您的 NSURLConnectionDelegate 方法中的一些代码?
标签: iphone objective-c memory memory-leaks