TitleForHeaderInSection抛出EXC_BAD_ACCESS

时间:2011-11-15 18:16:38

标签: objective-c cocoa-touch memory-management uitableview

我正在尝试在我的iPhone应用中创建通用UITableView。 我有一个UITableView,它通过SELECT查询循环使用数组填充数据。 我将数据添加到我的数组中并在cellForRowAtIndexPath:中填充数组。 我使用该数组获取节头,并使用排序方法,我将节标题放在Array1中。

我希望让titleForHeaderInSection:工作,让第0部分成为静态标题名称,第1部分以后变为通用名称,这意味着标题名称将来自Array1

我不确定如何创建该逻辑,因为应用程序始终使用以下代码抛出EXC_BAD_ACCESS

我的逻辑:我将数组的计数保留在int中并查看该值是否大于0.如果是,我将为objectAtIndex:0添加节标题,否则我使用静态的。但是当计数达到2时,对于第2节和objectAtIndex:1,它会中断并抛出EXC_BAD_ACCESS。

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    int value = [[self Array1] count];
    if(section == 0)
        return @"Countries";

    if (value > 0) {
        if (section == value){
        return [[self Array1] objectAtIndex:section - 1];
    }
    }   
}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    int count = [[self Array1] count];
    return count + 1;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section      
{
    int value = [[self Array1] count];
    if (section == 0) {
    return [self.Array count];
    }

    if (value > 0) {
        if (section == [[self Array1] count])  {
            NSString *initialLetter = [[self Array1] objectAtIndex:section - 1];

            // get the array of elements that begin with that letter
            NSArray *elementsWithInitialLetter = [self elementsWithInitialLetter:initialLetter];

            // return the count
            return [elementsWithInitialLetter count];
        }
    }

}

1 个答案:

答案 0 :(得分:0)

看起来你只是错过了支持Array1方法的iVar上的保留。将数组声明为属性:

@property (nonatomic, retain) NSArray* datastore;

然后在此方法中缓存您在Array1方法中引用的值(可能在viewDidLoad中)。

self.datastore = [self Array1];

然后将[self Array1]的所有剩余引用替换为self.datastore。构建运行并查看它是否仍然崩溃。 (别忘了在你的dealloc中设置self.datastore = nil