0

我的应用程序中有以下代码,并且“dict”对象存在内存泄漏。所以我对代码之后的最佳实践有几个问题:

// Convert JSON to dict
                NSError *error = nil;
                NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

                dispatch_async(dispatch_get_main_queue(), ^{
                    // If error return nil
                    if (error)
                        completion(nil, [self handleSerializationError:error]);
                    else if (![UsefulFunctions objectContainsData:dict[@"data"]])
                        completion(nil, NO);
                    // No error then return dict
                    else
                        completion(dict, NO);
                });

关于代码:完成处理程序传回 dict 对象,然后根据调用函数创建核心数据实体(因此是主线程)。被序列化的数据来自一个 NSURLConnection。所以问题如下:

1)这是在完成处理程序中传回数据的正确做法吗?

2)哪个函数应该负责内存管理,它应该是调用类吗?

3)是否值得将其包装在自动释放池中,或者这不是它们应该如何使用(一种单独的问题)。

4)任何人都可以从这个函数中看到为什么保留dict的任何明显原因,还是纯粹归结为调用类?

谢谢你的帮助

编辑(整个函数),只是为了确认我正在使用 ARC,并且这个函数是从主线程调用的:

- (void)downloadJSONFromURL:(NSURL *)url withCompletionHandler:(void (^)(id object, BOOL retry))completion
{
    // Check URL
    if (url)
    {
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        NSString *authToken = [NSString stringWithFormat:@"token %@", [UsefulFunctions returnActiveAPIKey]];
        [request setValue:authToken forHTTPHeaderField:@"Authorization"];
        [request setHTTPMethod:@"GET"];

        // Create an asynch request, don't want to hold up main queue
        [NSURLConnection sendAsynchronousRequest:request queue:[self operationQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError)
        {
            // If data exists
            if (data)
            {
                // Convert JSON to dict
                NSError *error = nil;
                NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

                dispatch_async(dispatch_get_main_queue(), ^{
                    // If error return nil
                    if (error)
                        completion(nil, [self handleSerializationError:error]);
                    else if (![UsefulFunctions objectContainsData:dict[@"data"]])
                        completion(nil, NO);
                    // No error then return dict
                    else
                        completion(dict, NO);
                });

            }
            // If error
            else if (connectionError)
            {
                //NSLog(@"Connection Error: %@, Code: %lu", connectionError.description, (long)connectionError.code);

                dispatch_async(dispatch_get_main_queue(), ^{
                    // Return nil
                    completion(nil, [self handleConnectionError:connectionError]);
                });
            }
        }];
    }
}
4

0 回答 0