2011-07-26 9 views
0

メモリ管理に問題があると思います。私は "EXC_BAD_ACCESS"エラーが2回目の割り当てを試みるときに(コードを実行して最初の割り当てを行いますが、2回目は消滅します)メモリの管理に問題がありますか? "EXC_BAD_ACCESS"エラーを受け取る

私はカスタムオブジェクト(日付と名前変数を含む)の配列をとる関数を持っています。私はこの配列を月ごとの配列にソートする必要があります(すべてのaprilはaprilListに、mayListにはmayなど)。

.hファイル

@class SceneData; 

@interface DetailedSceneViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> 
{ 
    UITableView *mainTableView; 
    SceneData *sceneData; 
    NSArray *monthsArray; 
} 


@end 

.mファイル

#import "SceneData.h" 


- (void) sortMonths { 
Agri_ImaGIS_iPhoneAppDelegate *dataCenter = (Agri_ImaGIS_iPhoneAppDelegate *) [[UIApplication sharedApplication] delegate]; 

NSMutableArray *janList, *febList, *marList, *aprList, *mayList, *junList, *julList, *augList, *sepList, *octList, *novList, *decList = [[NSMutableArray alloc] init]; 

int count = [dataCenter.sortedDataList count]; 

NSLog(@"count: %d", count); 

for (int i = 0; i < count; i++) 
{ 
    sceneData = [dataCenter.sortedDataList objectAtIndex:i]; 
    if ([sceneData.name rangeOfString:@"Jan" ].location != NSNotFound) 
    { 
     NSLog(@"jan name: %@", sceneData.name); 
     [janList addObject: sceneData]; 
    } 
    else if ([sceneData.name rangeOfString:@"Feb" ].location != NSNotFound) 
    { 
     NSLog(@"feb name: %@", sceneData.name); 
     [febList addObject:sceneData]; 
    } 
    else if ([sceneData.name rangeOfString:@"Mar" ].location != NSNotFound) 
    { 
     NSLog(@"Mar name: %@", sceneData.name); 
     [marList addObject:sceneData]; 
    } 
    else if ([sceneData.name rangeOfString:@"Apr" ].location != NSNotFound) 
    { 
     NSLog(@"Apr name: %@", sceneData.name); 
     [aprList addObject:sceneData]; 
    } 
    else if ([sceneData.name rangeOfString:@"May" ].location != NSNotFound) 
    { 
     NSLog(@"May name: %@", sceneData.name); 
     [mayList addObject:sceneData]; 
    } 
    else if ([sceneData.name rangeOfString:@"Jun" ].location != NSNotFound) 
    { 
     NSLog(@"Jun name: %@", sceneData.name); 
     [junList addObject:sceneData]; 
    } 
    else if ([sceneData.name rangeOfString:@"Jul" ].location != NSNotFound) 
    { 
     NSLog(@"Jul name: %@", sceneData.name); 
     [julList addObject:sceneData]; 
    } 
    else if ([sceneData.name rangeOfString:@"Aug" ].location != NSNotFound) 
    { 
     NSLog(@"Aug name: %@", sceneData.name); 
     [augList addObject:sceneData]; 
    } 
    else if ([sceneData.name rangeOfString:@"Sep" ].location != NSNotFound) 
    { 
     NSLog(@"Sep name: %@", sceneData.name); 
     [sepList addObject:sceneData]; 
    } 
    else if ([sceneData.name rangeOfString:@"Oct" ].location != NSNotFound) 
    { 
     NSLog(@"Oct name: %@", sceneData.name); 
     [octList addObject:sceneData]; 
    } 
    else if ([sceneData.name rangeOfString:@"Nov" ].location != NSNotFound) 
    { 
     NSLog(@"Nov name: %@", sceneData.name); 
     [novList addObject:sceneData]; 
    } 
    else if ([sceneData.name rangeOfString:@"Dec" ].location != NSNotFound) 
    { 
     NSLog(@"Dec name: %@", sceneData.name); 
     [decList addObject:sceneData]; 
    } 
} 
} 

私が間違ってsceneDataオブジェクトを扱うのですか?

答えて

2

あなたが正しくあなたの配列を初期化されていません。

NSMutableArray *janList, *febList, *marList, *aprList, *mayList, *junList, *julList, *augList, *sepList, *octList, *novList, *decList = [[NSMutableArray alloc] init]; 

この構文は唯一あなたが使用する必要があります...最後のポインタを初期化します:別のノートで

NSMutableArray *janList = [[NSMutableArray alloc] init]; 
NSMutableArray *febList = [[NSMutableArray alloc] init]; 
... 
NSMutableArray *decList = [[NSMutableArray alloc] init]; 

、これらすべてのオブジェクトをリークしています(あなたのコードで何かが欠落していなければ)ローカル変数(オートレリースされていない)であり、あなたはそれらに対してリリースを呼び出さないからです。

+0

ああ、ハハ!それは私が怠け者になるために得るものです。 xcodeは私に何かエラーや警告を与えていなかったので、私はinitがうまくいくように思った。あなたは正しいです、彼らはすべて漏れている、私はまだそれについて心配するほど遠くまで得ていなかった。助けてくれてありがとう! – Log139

+0

@ Log139 get goからメモリ管理を実装することをお勧めします。後でコードを追加すると、お尻に誤りが発生しやすくなります。デザイン、セキュリティ、および手動によるメモリ管理は、最終的にあなたがタックするものではありません。 – PeyloW