突然EXC_BAD_ACCESS在 - (NSString *)tableView:titleForHeaderInSection:

时间:2012-01-26 18:50:35

标签: ios uitableview exc-bad-access

我认为只显示我的整个代码比我的解释更好..实际上我不擅长用英语表达一些东西.X(

此代码是以下.m文件的.h文件。

#import <UIKit/UIKit.h>

#define kImageValueTag      0
#define kNameValueTag       1
#define kSubtitleValueTag   2
#define kMemoValueTag       3

@class PhonebookDetailedViewController;

@interface PhonebookViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
{
    UITableViewCell *tvCell;
    UITableView *tableView;
    UISearchBar *searchBar;

    NSString            *fullName;

    NSMutableDictionary        *names, *pictures;
    NSArray             *keys, *sortedKeys, *sortedAllValues;

    PhonebookDetailedViewController *childController;
}

@property (nonatomic, retain) IBOutlet UITableViewCell *tvCell;
@property (nonatomic, retain) IBOutlet UISearchBar  *searchBar;
@property (nonatomic, retain) IBOutlet UITableView  *tableView;
@property (nonatomic, retain) UIImage       *phoneImage;
@property (nonatomic, retain) NSString      *fullName;

@property (nonatomic, retain) NSMutableDictionary  *names;
@property (nonatomic, retain) NSMutableDictionary  *pictures;
@property (nonatomic, retain) NSArray       *keys;
@property (nonatomic, retain) NSArray       *sortedKeys;
@property (nonatomic, retain) NSArray       *sortedAllValues;

@end

此代码用于实现显示表的.m文件。当我尝试向下滚动表时,突然调用名为EXC_BAD_ACCESS的错误 - (NSString *)tableView:titleForHeaderInSection:method。我猜sortKeys在某个地方发布,因为我可以在错误之前做[sortedKeys count],但是当错误来临时却不能。但是,我不知道它在哪里发布以及它为什么会发布。请向我展示你的想法。任何想法都没关系。提前谢谢。

#import "PhonebookViewController.h"
#import "PhonebookDetailedViewController.h"
#import "NSString-SortForIndex.h"

@implementation PhonebookViewController

@synthesize tvCell;
@synthesize searchBar;
@synthesize tableView;
@synthesize phoneImage;
@synthesize fullName;

@synthesize names, pictures;
@synthesize keys, sortedAllValues, sortedKeys;

//- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
//{
//    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
//    if (self) {
//        // Custom initialization
//    }
//    return self;
//}

//- (void)didReceiveMemoryWarning
//{
//    // Releases the view if it doesn't have a superview.
//    [super didReceiveMemoryWarning];
//    
//    // Release any cached data, images, etc that aren't in use.
//}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];

    CGRect bounds   = self.tableView.bounds;
    bounds.origin.y = bounds.origin.y + searchBar.bounds.size.height;
    self.tableView.bounds = bounds;

    NSArray *paths  = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString    *nameFilePath   = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"nameContacts.dict"];
    NSString    *pictureFilePath    = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"imageContacts.dict"];

    self.names  = (NSMutableDictionary *)[NSKeyedUnarchiver unarchiveObjectWithFile:nameFilePath];
    self.pictures   = (NSMutableDictionary *)[NSKeyedUnarchiver unarchiveObjectWithFile:pictureFilePath];
    self.keys   = [self.names allKeys];

    sortedKeys   = [self.keys sortedArrayUsingSelector:@selector(sortForIndex:)];
    sortedAllValues    = [[NSArray alloc] init];
    for (NSString   *sortedKey in sortedKeys)
    {
        NSArray *selectedValues = [self.names valueForKey:sortedKey];
        for (NSString *selectedValue in selectedValues)
            sortedAllValues = [sortedAllValues arrayByAddingObject:selectedValue];
    }

    // Do any additional setup after loading the view from its nib.
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;

    self.tableView  = nil;
    self.searchBar  = nil;
    self.tvCell     = nil;
    self.fullName       = nil;

    self.names      = nil;
    self.pictures   = nil;
    self.keys       = nil;
    self.sortedKeys = nil;
    self.sortedAllValues    = nil;

}

- (void)dealloc
{
    [tableView release];
    [searchBar release];
    [tvCell release];
    [fullName       release];

    [names  release];
    [pictures   release];
    [keys   release];
    [sortedKeys release];
    [sortedAllValues    release];

    [super dealloc];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark - Table Data Source Methods

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{    
    return [sortedKeys count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSString    *key    = [sortedKeys objectAtIndex:section];
    NSArray     *nameSection    = [names objectForKey:key];
    return [nameSection count];
}

- (UITableViewCell  *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CustomCellIdentifier   = @"CustomCellIdentifier";

    UITableViewCell *cell   =   [self.tableView dequeueReusableCellWithIdentifier:CustomCellIdentifier];

    if ( cell == nil )
    {
        NSArray *nib    =   [[NSBundle mainBundle] 
                             loadNibNamed:@"CustomPhonebookCell"
                             owner:self
                             options:nil];
        if (nib.count > 0)
        {
            cell = self.tvCell;
        } else
        {
            NSLog(@"Failed to load CustomPhonebookCell nib file!");
        }
    }
    cell.accessoryType  = UITableViewCellAccessoryDetailDisclosureButton;
    NSUInteger  row = [indexPath   row];
    NSUInteger  section = [indexPath section];

    NSString *foundKey  = [sortedKeys objectAtIndex:section];
    NSArray *nameSection    = [self.names   objectForKey:foundKey];

    UILabel *nameLabel  = (UILabel *)[cell viewWithTag:kNameValueTag];
    nameLabel.text  = [nameSection objectAtIndex:row];        

    return cell;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    NSString    *key    = [sortedKeys objectAtIndex:section]; // EXC_BAD_ACCESS error at here
    return key;
}

1 个答案:

答案 0 :(得分:3)

sortedKeys未正确保留。设置时使用self.

self.sortedKeys = [self.keys sortedArrayUsingSelector:@selector(sortForIndex:)];