0

我在此方法中收到此消息“Tread 9: EXC_BAD_ACCESS (code=1, address=0x70000010)(但只有在下载另一个线程文件时才会创建此错误):

- (NSMutableDictionary *) getDictionaryAllStatin:(sqlite3*)database
{

    if (self._streetsArrey == nil || self._streetsArrey.count <= 0) {
        [self getArrayAllStatin:database];
    }

    /*--------------------------------------------------------------*/
    NSMutableDictionary *result1 = [[NSMutableDictionary alloc] init];

    for (StreetData *street in _streetsArrey) {
        NSString * name = [self deleteContractionWithText:street._name];
        NSArray * arr = [name componentsSeparatedByString:@" "];
        NSMutableArray *arrm = [[NSMutableArray alloc] initWithArray:arr];
        arr = nil;
        [arrm addObject:name];

            for (NSString *txt in arrm) {
                int lengthText = txt.length;
                for (int i = 2 ; i <= lengthText; i++) {
                    NSString * key = [txt substringToIndex:i];
                    key = [key lowercaseString];
                    NSMutableDictionary *isSet = [result1 objectForKey:[NSNumber numberWithInt:[key hash]]];
                    if (isSet == nil) {
                        isSet = [[NSMutableDictionary alloc]init];
                    }
                    [isSet setObject:street forKey:[NSNumber numberWithInt:street._streetId]];
                    [result1 setObject:isSet forKey:[NSNumber numberWithInt:[key hash]]];
                    isSet = nil;
                    key = nil;
                }
            }

    }

    NSMutableDictionary *result = [[NSMutableDictionary alloc] init];
    for (id key in result1) {
        NSMutableDictionary *dictionary = [result1 objectForKey:key];
        NSArray *arr = [dictionary allValues];
        [result setObject:arr forKey:key];
        arr = nil;
        [dictionary removeAllObjects];
        dictionary = nil;

    }
    [result1 removeAllObjects];
    result1 = nil;
    /*--------------------------------------------------------------*/
    if (result.count > 0) {
        _streetsDictionary = result;
        result = nil;
        return _streetsDictionary;
    }else {
        _streetsDictionary = nil;
        return nil;
    }
}

在此处输入图像描述

在此处输入图像描述

为什么我会收到此消息?

我该如何解决?

4

1 回答 1

2

崩溃的最可能原因是试图访问已被释放的对象。

既然看起来故障就行了:

  NSMutableDictionary *isSet = [result1 objectForKey:[NSNumber numberWithInt:[key hash]]];

我建议将语句拆分为其组件,以尝试找出哪个对象实际上可能是罪魁祸首:

 NSInteger h = [key hash];
 NSNumber n = [NSNumber numberWithInt:h];
 ...

但是只有在下载另一个线程文件时才会创建此错误

另外,检查下载代码和崩溃代码是否有任何共同之处。前者可能导致释放第二个中使用的对象。

希望能帮助到你。

于 2013-02-01T09:05:35.307 回答