gpt4 book ai didi

ios - iOS-NJSONSerialization导致内存泄漏?(根据Instruments)

转载 作者:行者123 更新时间:2023-12-01 16:45:47 26 4
gpt4 key购买 nike

下面是带有代码的方法,其中我使用手动内存管理遇到内存泄漏。通过使用Xcode工具检测到内存泄漏,并特别指向我正在使用NSJSONSerialization的行。我正在运行目标应用程序(在装有iOS 6.1的设备上)。

我第一次点击refreshButton时没有泄漏。随后进行的任何轻触都会产生泄漏(如果我继续轻按该按钮,还会产生更多泄漏)。下面是代码-这是使用JSON Web服务的基本内容(Web服务链接是虚假的,但是我正在使用的真实链接是有效的)。您会注意到,我正在使用Grand Central Dispatch,这样我就可以更新UI,而无需等待JSON的解析完成。

仪器检测到的线被星号包围。我想为可能对这里发生的事情有任何想法的任何人提供帮助。完整的堆栈跟踪(如以下注释中所述,我将放在此处:)

+(NSJSONSerialization JSONObjectWithData:option:error:]->-[_ NSJSONReader parseData:options:]->-[_ NSJSONReader parseUTF8JSONData:skipBytes:options]-> newJSONValue-> newJSONString-> [NSPlaceholde‌rString
initWithBytes:length:encoding:]

-(void)parseDictionary:(NSDictionary *)dictonary{

self.transactions = [dictonary objectForKey:@"transactions"];
if(!self.transactions){
NSLog(@"Expected 'transactions' array");
return;
}

for (int arrayIndex = 0; arrayIndex < [self.transactions count]; arrayIndex++) {
TransactionResult *result = [[[TransactionResult alloc] init] autorelease];
result.transactionID = [[self.transactions objectAtIndex:arrayIndex] objectForKey:@"ID"];
result.transactionDescription = [[self.transactions objectAtIndex:arrayIndex] objectForKey:@"description"];
result.transactionPrice = [[self.transactions objectAtIndex:arrayIndex] objectForKey:@"price"];
self.totalPrice += [result.transactionPrice doubleValue];
NSLog(@"total price: %f", self.totalPrice);
[self.transactionResults addObject:result];
result = nil;
}

}
 - (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;
}
});
}

最佳答案

我在4.3发行时就使用了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

关于ios - iOS-NJSONSerialization导致内存泄漏?(根据Instruments),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20027987/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com