保留数组上的dealloc崩溃。程序收到信号:“EXC_BAD_ACCESS”

时间:2011-05-27 02:39:36

标签: objective-c ios memory-management nsmutablearray retain

我在一个表视图控制器的dealloc中遇到了EXC_BAD_ACCESS崩溃问题。释放给定retain属性的NSMutableArray时发生崩溃。我有第二个NSMutableArray也被赋予了一个retain属性,但是它的发布不会导致崩溃。请查看以下代码,看看我是否忽略了有关内存管理的内容。感谢。

在我的标题文件中,我有以下内容:

@interface selectSourcesTableViewController : UIViewController  <UITableViewDelegate, UITableViewDataSource> {
    NSMutableArray *selectedNames;
    NSMutableArray *selectedAvailability;
}

@property (retain, nonatomic)   NSMutableArray  *selectedNames;
@property (retain, nonatomic)   NSMutableArray  *selectedAvailability;

在我的实施中,我有以下内容:

@implementation selectSourcesTableViewController
@synthesize selectedNames;
@synthesize selectedAvailability;

- (void)viewDidLoad {

    NSArray *names = [selectedSourceFileContent objectForKey:@"selectedNames"];
    selectedNames = [[NSMutableArray alloc] initWithObjects: nil];

    NSArray *availability = [selectedSourceFileContent objectForKey:@"selectedAvailability"];
    selectedAvailability = [[NSMutableArray alloc] initWithObjects: nil];

    for (int i=0; i < [names count]; i++) {
        NSString *aName = [names objectAtIndex:i];
        [selectedNames addObject: aName];
        NSString *anAvailability = [availability objectAtIndex:i];
        [selectedAvailability addObject: anAvailability];
    }
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: kCellIdentifier];

...

    for (int i=0; i < [selectedNames count]; i++) {
        if ([contentForThisRow isEqualToString:[selectedNames objectAtIndex:i]]) {
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
        }
    }
}

- (void)dealloc {
    [super dealloc];
    [selectedNames release];
    [selectedAvailability release];
}

上面显示的代码显示了这两个数组的唯一用途。

因此,当selectedNames发布时没有任何不好的事情发生,但是当selectedAvailability被释放时,我得到了EXC_BAD_ACCESS崩溃。

最后一次观察。启动xcode后第一次运行此代码时没有崩溃。此后,每次重新运行应用程序时都会崩溃。

有什么想法吗?

1 个答案:

答案 0 :(得分:6)

[super dealloc]

需要在你自己的dealloc方法中最后调用,而不是先调用。