0

このメソッドで「トレッド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];
 ...

ただし、このバグは、別のスレッドファイルがダウンロードされている場合にのみ作成されます。

また、ダウンロードコードとクラッシュコードに共通点がないか確認してください。前者は、2番目で使用されたオブジェクトの割り当て解除を引き起こしている可能性があります。

それが役に立てば幸い。

于 2013-02-01T09:05:35.307 に答える