iOS-导致内存泄漏???(根据仪器)

iOS-导致内存泄漏???(根据仪器),ios,memory-management,memory-leaks,nsjsonserialization,xcode-instruments,Ios,Memory Management,Memory Leaks,Nsjsonserialization,Xcode Instruments,下面是代码的方法,我使用手动内存管理得到内存泄漏。内存泄漏是通过使用Xcode仪器检测到的,它特别指向我正在使用NSJSONSerialization的线路。我正在运行目标应用程序(在iOS 6.1设备上) 我第一次按刷新按钮时,没有泄漏。任何后续的点击都会产生泄漏(如果我继续点击按钮,还会有更多的泄漏)。下面是代码-这是使用JSON web服务的基本内容(web服务链接是假的,但我使用的真正链接是有效的)。您会注意到,我正在使用grandcentraldispatch,这样我就可以在不等待JS

下面是代码的方法,我使用手动内存管理得到内存泄漏。内存泄漏是通过使用Xcode仪器检测到的,它特别指向我正在使用NSJSONSerialization的线路。我正在运行目标应用程序(在iOS 6.1设备上)

我第一次按刷新按钮时,没有泄漏。任何后续的点击都会产生泄漏(如果我继续点击按钮,还会有更多的泄漏)。下面是代码-这是使用JSON web服务的基本内容(web服务链接是假的,但我使用的真正链接是有效的)。您会注意到,我正在使用grandcentraldispatch,这样我就可以在不等待JSON解析完成的情况下更新UI

仪器检测到的线被星号包围。我想得到一些帮助,任何人谁可能有一个什么是发生在这里的想法。完整堆栈跟踪(如下面我将在此处添加的注释中所述:)

+(NSJSONSerialization JSONObjectWithData:option:error:->-[[U NSJSONReader parseData:options:]->-[[U NSJSONReader parseUTF8JSONData:skipBytes:options]->newJSONValue->newJSONString->[NSPlaceholde‌​串 initWithBytes:长度:编码:]


我在4.3版本发布时就使用了ARC,并在应用商店中发布了一个应用程序,重点是你可以切换到ARC。也就是说,我试图通过创建一个没有ARC标志的类/文件来重现你的问题,但无法重现问题。这让我相信你的问题在别处。在下面的代码中,我创建了一个Test对象在另一个文件中,保留它,并将测试消息发送给它。无论我将“I”设置为什么,它始终解除分配该对象:

#import "Tester.h"

@interface Obj : NSObject <NSObject>
@end

@implementation Obj

- (id)retain
{
    NSLog(@"retain");
    id i = [super retain];
    return i;
}

- (oneway void)release
{
    NSLog(@"release");
    [super release];
}

- (void)foo
{

}

- (void)dealloc
{
    NSLog(@"Obj dealloced");
    [super dealloc];
}

@end

@implementation Tester

- (void)test
{
    int i = 2;

    __block Obj *obj;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{
        obj = [[Obj new] autorelease];

        if(i == 0) {
            Obj *o = obj;
            dispatch_async(dispatch_get_main_queue(), ^
                {
                    [o foo];
                } );
        } else if(i == 1) {
            obj = nil;
        } else if(i == 2) {
            dispatch_async(dispatch_get_main_queue(), ^
                {
                    obj = nil;
                } );
        }
    } );

}

@end
#导入“Tester.h”
@接口对象:NSObject
@结束
@实施目标
-(id)保留
{
NSLog(@“保留”);
id i=[超级保留];
返回i;
}
-(单向无效)释放
{
NSLog(“发布”);
[超级发布];
}
-(作废)富
{
}
-(无效)解除锁定
{
NSLog(“Obj解除分配”);
[super dealoc];
}
@结束
@实现测试仪
-(无效)试验
{
int i=2;
__块Obj*Obj;
调度异步(调度获取全局队列(调度队列优先级默认为0)^{
obj=[[obj新]自动释放];
如果(i==0){
Obj*o=Obj;
dispatch\u async(dispatch\u get\u main\u queue()^
{
[o foo];
} );
}else如果(i==1){
obj=零;
}else如果(i==2){
dispatch\u async(dispatch\u get\u main\u queue()^
{
obj=零;
} );
}
} );
}
@结束

我的第一个问题始终是,您是否有理由不能切换到ARC。因为不幸的是,我必须支持iOS 4.3。在这种情况下,好消息是……iOS 4.3支持ARCLite。ARCLite是ARC,没有任何弱引用。请参阅。这很好-感谢链接。不过,我想找出手头的问题,而不是尝试我正在想办法解决这个问题。好吧,用最困难的方法…:-)解析字典是什么样子的?另外,我认为您不需要在第一个
else
分支中调用
resultObject
上的
release
,因为它应该是自动删除的。是否执行过任何
else
分支?但您没有使用NSJSONSerialization。我不知道,但不知怎的,我认为要么仪器工具中有一个bug,要么NSJSONSerialization出现了一些问题。请看一下Instruments的调用堆栈,它会告诉您问题所在。我一直在检查我的代码,但还没有看到我的任何NSString在哪里泄漏,并且Analyzer没有发现任何错误。我可能需要寻找的任何其他东西,或者仪器中是否有任何东西可以帮助我进一步检测问题??代码的要点是测试块保留和释放对象的各种方式-正如我所说的,在非ARC环境中工作-对象最初保留,然后在最后释放,即使你在块中间删除变量。您没有为[self-parseDictionary:Dictorial]提供代码,是否先发布然后保留新词典?此外,您的体系结构并不是最好的—您正在使用Apple便捷例程在并发队列上执行同步后台提取,所有这些都是为了避免使用您自己的NSURLConnection+回调。
 - (IBAction)refreshButtonPressed:(UIBarButtonItem *)sender {
        __block id resultObject;
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{
        NSURL *url = [NSURL URLWithString:@"http://mywebservice.php"];
        NSData *data = [NSData dataWithContentsOfURL:url];

        NSError *error;
        ***resultObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];***

        if(!error){
            if([resultObject isKindOfClass:[NSDictionary class]]){
                NSDictionary *dictonary = resultObject;
                [self parseDictionary:dictonary];
                NSLog(@"Done parsing!");
                dispatch_async(dispatch_get_main_queue(), ^{
                    self.isLoading = NO;
                    [self.transactionsTableView reloadData];
                });
            }
            else{
                NSLog(@"JSON Error: Expected Dictionary");
                resultObject = nil;
                return;
            }
        }
        else{
            NSLog(@"JSON Error: %@", [error localizedDescription]);
            dispatch_async(dispatch_get_main_queue(), ^{
                resultObject = nil;
                [self.transactionsTableView reloadData];
                [self showError];
            });
            return;
        }
    });
    }
#import "Tester.h"

@interface Obj : NSObject <NSObject>
@end

@implementation Obj

- (id)retain
{
    NSLog(@"retain");
    id i = [super retain];
    return i;
}

- (oneway void)release
{
    NSLog(@"release");
    [super release];
}

- (void)foo
{

}

- (void)dealloc
{
    NSLog(@"Obj dealloced");
    [super dealloc];
}

@end

@implementation Tester

- (void)test
{
    int i = 2;

    __block Obj *obj;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{
        obj = [[Obj new] autorelease];

        if(i == 0) {
            Obj *o = obj;
            dispatch_async(dispatch_get_main_queue(), ^
                {
                    [o foo];
                } );
        } else if(i == 1) {
            obj = nil;
        } else if(i == 2) {
            dispatch_async(dispatch_get_main_queue(), ^
                {
                    obj = nil;
                } );
        }
    } );

}

@end