iphone dev: NSTableView и NSMublyArray и имена файлов имеют доступ exe_bad - PullRequest
0 голосов
/ 15 сентября 2009

У меня есть контроллер навигации, rootviewcontroller - это табличное представление, которое покажет все имена файлов, когда пользователь щелкнет по файлу, покажет содержимое файла в contentviewer. Пользователь может вернуться назад, используя панель навигации.

Проблема иногда в том, что пользователь использует панель навигации, чтобы вернуться назад. Приложение упало. скажем exe-bad-access в cellForRowatIndex эту строку:

cell.textLabel.text = [books objectAtIndex: indexPath.row];

Я трачу много времени, чтобы выяснить проблему. но не могу найти где это не так. Пожалуйста, помогите

rootviewController.h

@interface rootviewController:UITableViewController{NSMutablyArray* books;}

rootviewContorller.m

import rootviewController.h;
static NSString *MyIdentifier = @"MyIdentifier";
-(void)awakefromNIb
{
    books=[[NSMutalbyArray alloc]init];
    NSString *file;
    NSString *docsDir = [NSHomeDirectory() stringByAppendingPathComponent:  @"Documents"];
    NSDirectoryEnumerator *dirEnum =
        [[NSFileManager defaultManager] enumeratorAtPath:docsDir];

    while (file = [dirEnum nextObject]) {
        if ([[file pathExtension] isEqualToString: @"doc"]) {
            [books addObject:file];
        }
    }
}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
    }

    cell.textLabel.text = [books objectAtIndex:indexPath.row];

    return cell;
}

Ответы [ 2 ]

1 голос
/ 15 сентября 2009

EXEC_BAD_ACCESS означает, что вы обращаетесь к памяти, которой не владеете. В ObjC это почти всегда означает, что вы что-то переоценили (недооценили). В этом случае вы почти наверняка либо перевыпустили books, либо IndexPath. Это опечатка в вашем посте, или у вас где-то есть переменная с именем IndexPath? Ваш параметр indexPath.

Вы должны проверить каждую из этих переменных и убедиться, что они ссылаются на выделенную память. В отладчике вы можете сделать это с помощью po books. Или вы можете NSLog(@"books=%@", books).

Как примечание, # 1 способ избежать ошибок чрезмерного выпуска состоит в том, чтобы всегда использовать средства доступа. Никогда не получайте доступ к своим иварам непосредственно за пределами аксессуара (и -dealloc). Соблюдение этого правила избавит вас от душевных страданий. Вы нарушаете это правило с помощью books, и оно, вероятно, сжигает вас.

0 голосов
/ 15 сентября 2009

Когда вы выделяете books?

Я не вижу выделения в этом коде, но, вероятно, у вас оно есть до строки [books addObject:file], так как в противном случае вы могли бы увидеть исключение там.

Если у вас где-то есть распределение, вы можете случайно сделать что-то вроде:

books = [NSMutableArray array];

Однако это неправильный способ сделать это, поскольку это дает вам временное NSMutableArray, и вы хотите использовать его на протяжении жизни вашего объекта. Есть несколько способов сделать это; один из них:

books = [[NSMutableArray alloc] init];

, который дает books счет сохранения 1, и books не будет освобожден, пока кто-то (надеюсь, вы или хороший друг) не выпустит его. Возможно, вы захотите добавить вызов к [books release]; в вашем методе dealloc, чтобы позже очистить эту память.

Ссылка: Руководство по программированию управления памятью для какао: mem. дирекция правила

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...