针对iphone的Objective-c:神秘内存泄漏

时间:2010-05-26 12:07:34

标签: iphone objective-c memory memory-leaks

我的应用程序似乎有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”调用中尝试[连接取消]以查看是否有帮助,但根本没有。

对我来说这肯定是个谜......

1 个答案:

答案 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 状态(按照惯例)。