我的应用程序似乎有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的设备上
在你的应用程序中有几个内存泄漏是否可以接受,或者它们都必须去?
编辑:我已经为getUrl添加了autorelease。但是它仍然显示内存泄漏
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 上放了一个断点,调用[连接释放] 这个dealloc从未被调用过。除了这个之外,所有dealloc都被称为链。 我在“connectionDidFinishLoading”调用中尝试[连接取消]以查看是否有帮助,但根本没有。
对我来说这肯定是个谜......
答案 0 :(得分:0)
你正在释放你不应该发布的东西:
NSURL *url = [self getUrl:destination];
// the returned url should have been autoreleased by the getUrl: method
// so you shouldn't release it again
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
[url release]; // don't do this!
请记住,您应该只发布使用 alloc , new 或保留创建的对象。从其他方法返回的对象始终处于 auoreleased 状态(按照惯例)。