【问题标题】:Memory Management issue? receiving "EXC_BAD_ACCESS" error内存管理问题?收到“EXC_BAD_ACCESS”错误
【发布时间】:2011-07-26 16:17:11
【问题描述】:

我相信内存管理有问题。我在尝试第二次分配时收到“EXC_BAD_ACCESS”错误(运行代码并进行第一次分配,但第二次使其死亡)。

我有一个函数,它将接受一组自定义对象(包含日期和名称变量)。我需要将此数组排序为特定月份的数组(所有四月将进入 aprilList,可能进入 mayList 等)。

.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 对象?

【问题讨论】:

    标签: iphone objective-c memory-management exc-bad-access


    【解决方案1】:

    你没有正确初始化你的数组:

    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];
    

    另一方面,所有这些对象都在泄漏,因为(如果我没有遗漏您的代码中的某些内容)它们是局部变量(不是自动释放的)并且您不会对它们调用 release...

    【讨论】:

    • 哦,哈哈!这就是我变得懒惰的原因。 xcode 没有给我任何错误或警告,所以我认为所有的 init 都可以这样工作。你是对的,它们都在泄漏,我还没有走得足够远来担心这个。感谢您的帮助!
    • @Log139 从一开始就实现内存管理是个好主意。稍后添加代码是一个容易出错的麻烦。设计、安全性和手动内存管理不是您最终要解决的问题。
    猜你喜欢
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多