Борьба с EXC_BAD_ACCESS и UITableViewCell - PullRequest
0 голосов
/ 25 ноября 2011

Я тут рву свои волосы. Мой RootViewController загружает массив строк из plist. Когда он загружается, он работает нормально. Затем я нажимаю на строку, которая отправляет его новому контроллеру представления. Если я вернусь, таблица все еще работает нормально, поэтому я нажимаю на другую строку, которая работает, как ожидалось. Теперь, если я возвращаюсь и прокручиваю, я получаю сбой, указывающий на cell.textLabel.text = [self.faceCategories objectAtIndex:indexPath.row];

Сокращенный исходный код ниже:

// RootViewController.h

#import <UIKit/UIKit.h>

@class DetailViewController;

@interface RootViewController : UITableViewController {
    NSMutableArray *faceCategories;
}
@property (nonatomic, retain) NSMutableArray *faceCategories;
@end

Реализация RootViewController // RootViewController.m

#import "RootViewController.h"

@synthesize faceCategories;

- (void)viewDidLoad
{
    [super viewDidLoad]; 

    // Init array
    if (self.faceCategories == nil) {
        NSLog(@"NIL NIL NIL NIL NIL NIL NIL NIL NIL");
        NSError *error;
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //Create a list of paths.
        NSString *documentsDirectory = [paths objectAtIndex:0]; //Get a path to your documents directory from the list.
        NSString *path = [documentsDirectory stringByAppendingPathComponent:@"faceCategories.plist"]; //Create a full file path.

        NSFileManager *fileManager = [NSFileManager defaultManager];

        if (![fileManager fileExistsAtPath: path]) //Check if file exists.

        {
            NSString *bundle = [[NSBundle mainBundle] pathForResource:@"faceCategories" ofType:@"plist"]; //Get a path to your plist created before in bundle directory (by Xcode).
            [fileManager copyItemAtPath:bundle toPath: path error:&error]; //Copy this plist to your documents directory.
        }
        // Zombies percentages after
        NSMutableArray *fileContents = [[NSMutableArray alloc] initWithContentsOfFile: path]; // 55.6%
        self.faceCategories = [[NSMutableArray alloc] initWithArray:fileContents copyItems:YES]; // 33.3%
        [fileContents release]; // 11.1%

    }
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

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

    /////////////////////////////
    // CRASH HERE only after I return to this view controller a couple of times
    // If I enable breakpoints and add a log I can see that faceCategories still contains the right number of objects
    /////////////////////////////
    cell.textLabel.text = [self.faceCategories objectAtIndex:indexPath.row];

    return cell;
}


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

@end

Хотя мои навыки управления памятью являются базовыми, я не вижу в этом ничего особенно плохого, поэтому буду признателен за свежий взгляд, если кто-нибудь будет так добр? Я нахожу особенно странным, что это проявляется, только когда я возвращаюсь к корневому контроллеру пару раз.

Полный источник - http://pastebin.com/5XzwN0bA

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

Попробуйте изменить три строки после: // Zombies percentages after с помощью:

NSMutableArray *fileContents = [[NSMutableArray alloc] initWithContentsOfFile:path];
self.faceCategories = fileContents;
[fileContents release];
0 голосов
/ 26 ноября 2011

Хотя это и не совсем исправление, я обнаружил, что самый простой способ избавиться от этих ошибок - включить ARC. Для этого перейдите в Edit> Refactor> Convert to Objective-C ARC.

Прочитайте различные сообщения в блоге ARC, но, делая это, я полностью забываю об управлении памятью и концентрируюсь на новых функциях.

...