0

私はなぜEXC_BAD_ACESS このコードを取得しているのかを理解しようとしています。私には手がかりがありません。誰かが私を助けてくれますか?

- (void)loadJsonFile:(NSString*)fileName {
    NSError *error = nil;
    NSData *jsonData = [[[NSString alloc]
                         initWithContentsOfFile:[[NSBundle mainBundle]
                                                 pathForResource:fileName ofType:@"json"]
                         encoding:NSUTF8StringEncoding error:&error]
                        dataUsingEncoding:NSUTF8StringEncoding];
    
    jsonDic = [[NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error] retain];
   [jsonData release];
}

「」行をコメントアウトすると[jsonData release];、すべてが機能します。しかし、なぜ ?割り当てjsonData、データを入力しNSJSONSerialization、jsonDicを取得するために渡します。シリアル化した後、を解放しjsonDataてjsonDicを使用したいのですが、しばらくすると「[jsonData release];」「取得中EXC_BAD_ACCESS」の例外が発生します。

私には手がかりがありません、助けていただければ幸いです。

4

1 に答える 1

2

あなたは解放jsonDataしますが、それを保持することはありません。静的アナライザー(メニュー"Product" ➞ "Analyze")は、この問題を示しているはずです。NSStringまた、割り当てているものを解放していません。

このようにしてください:

- (void)loadJsonFile:(NSString*)fileName {
    NSError *error = nil;
    NSData *jsonData = [[[[[NSString alloc]
                         initWithContentsOfFile:[[NSBundle mainBundle]
                                                 pathForResource:fileName ofType:@"json"]
                         encoding:NSUTF8StringEncoding error:&error] autorelease]
                        dataUsingEncoding:NSUTF8StringEncoding] retain];

    jsonDic = [[NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error] retain];
    [jsonData release];
}

ARC(自動参照カウント)の使用を検討することをお勧めします。Xcodeは、Menuを使用してプロジェクトをほぼ完全に自動的に変換できます"Edit" ➞ "Refactor" ➞ "Convert to Objective-C ARC…"。手動でメモリを管理し続ける理由はごくわずかです。

于 2012-08-13T12:09:41.160 に答える