Сбой при прокрутке таблицы - PullRequest
1 голос
/ 26 октября 2011

Я пытаюсь отобразить NSMutableArray объекта, который я создал, в UITableView.Все отображается, кроме того, когда я пытаюсь прокрутить представление таблицы, а затем я получаю EXC_BAD_ACCESS.

Вот мой объект:

.h file

@interface EmailAddressClass : NSObject {
   @public NSString * fullName;
   @public NSString * myEmailAddress;
    BOOL isSelected;
}
@property (nonatomic, retain) NSString * fullName;
@property (nonatomic, retain) NSString * myEmailAddress;


- (void) setFullname:(NSString *)pMyName;
- (void) setMyEmailAddress:(NSString *)pEmailAddress;
- (void) setIsSelected:(BOOL)pSelectedFlag;
- (BOOL) getIsSelected;
- (NSString *) getFullname;
- (NSString *)getMyEmailAddress;
@end

.m file

#import "EmailAddressClass.h"

@implementation EmailAddressClass
@synthesize fullName;
@synthesize myEmailAddress;

- (void) setFullname:(NSString *)pMyName{
    fullName = pMyName;
}

- (void) setMyEmailAddress:(NSString *)pEmailAddress{
    myEmailAddress = pEmailAddress;
}

- (NSString *) getFullname{
    return fullName;
}

- (NSString *)getMyEmailAddress{
    return myEmailAddress;
}

- (void) setIsSelected:(BOOL)pSelectedFlag{
    isSelected = pSelectedFlag;
}

- (BOOL) getIsSelected{
    return isSelected;
}

@end

Достаточно просто;просто небольшой класс, который содержит имя и адрес электронной почты как NSString s.

Вот так я заполняю массив из адресной книги именами и адресами электронной почты

- (NSMutableArray*)getAllEmailAddress{
    CFMutableArrayRef myMutablePeople = [self getSortedAddressBook];
    NSMutableArray *allEmails = [[NSMutableArray alloc] initWithCapacity:CFArrayGetCount(myMutablePeople)];


    for (CFIndex i = 0; i < CFArrayGetCount(myMutablePeople); i++) {
        ABRecordRef person = CFArrayGetValueAtIndex(myMutablePeople, i);
        ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);
        NSString *firstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
        NSString *lastName = (NSString *) ABRecordCopyValue(person, kABPersonLastNameProperty);

        for (CFIndex j=0; j < ABMultiValueGetCount(emails); j++) {
            NSString* email = (NSString*)ABMultiValueCopyValueAtIndex(emails, j);
            EmailAddressClass * anEmailPerson = [EmailAddressClass alloc];
            [anEmailPerson setIsSelected:YES];
            [anEmailPerson setMyEmailAddress:email];
            if ((firstName) && (lastName) != nil){    
                [anEmailPerson setFullname:[NSString stringWithFormat:@"%@ %@", firstName, lastName]];
            } else if ((firstName != nil) && (lastName == nil)){
                [anEmailPerson setFullname:[NSString stringWithFormat:@"%@", firstName]];
            } else if ((firstName ==nil) && (lastName != nil)){
                [anEmailPerson setFullname:[NSString stringWithFormat:@"%@", lastName]];
            } else {
                [anEmailPerson setFullname:[NSString stringWithFormat:@"%@", email]];

            }

            [allEmails addObject:anEmailPerson];
            [email release];
            [anEmailPerson release];
        }
        CFRelease(emails);
    }
    CFRelease(myMutablePeople);
   // CFRelease(people);
    return  allEmails;
}

Все работаетк этому моменту;массив возвращает правильное количество людей с их адресом электронной почты.

Так я заполняю табличное представление

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
    }
    thisPerson = (EmailAddressClass *)[allEmails objectAtIndex:indexPath.row];

    cell.textLabel.text = [thisPerson getFullname];

    return cell;
}

Чего мне не хватает?

snipped of of EmailListViewController.h

#import "EmailAddressClass.h"

@interface EmailListViewController : UITableViewController {

    NSMutableArray *allEmails;
    EmailAddressClass * thisPerson;
}


@property (nonatomic, retain) NSMutableArray *allEmails;
@property (nonatomic, retain) EmailAddressClass * thisPerson;

@ синтезировать все сообщения электронной почты, это лицо;оба синтезируются в файле .m

в Viewdidload в EmailListViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.navigationController.toolbarHidden=NO;
    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;
 self.tableView.rowHeight = ROW_HEIGHT;
    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;

    allEmails = [[MsgController sharedMsgController] getAllEmailAddress];

    /*NSLog(@"There are : %d number of emails", [allEmails count]);

    for (EmailAddressClass *email in allEmails)
    {
        NSLog(@"%@ : %@", [email getFullname],[email getMyEmailAddress]) ;
    }
     */
}

, вывод консоли показывает правильные имена и электронные письма в массиве

1 Ответ

1 голос
/ 26 октября 2011

Когда вы зацикливаетесь и настраиваете, вы создаете строку, вызывая stringWithFormat. Поскольку это не alloc, copy, mutableCopy, он автоматически освобожден.

Затем вы назначаете его, удерживаете, но не сохраняете:

В цикле:

// this is autoreleased
[anEmailPerson setFullname:[NSString stringWithFormat:@"%@ %@", firstName, lastName]];

В классе:

// you're holding a reference to something that's about to go poof
- (void) setFullname:(NSString *)pMyName{
    fullName = pMyName;
}

Я бы порекомендовал либо сохранить его, либо объявить его как свойство и синтезировать его:

@property (retain, atomic) NSString *fullName;

затем в .m

@synthesize fullName;

Я бы также порекомендовал, чтобы ваша функция getAllEmailAddresses выполняла автоматическое освобождение - вызывающая функция может сохранить ее. Ваше свойство allEmails сохранит его после автоматического выпуска функции. Правила управления памятью гласят, что если он не начинается с alloc, copy или immutableCopy, он автоматически освобождается, и вызывающий может его сохранить.

Прочитайте руководство по управлению памятью Apple - хорошо прочитайте.

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

В частности, на второй странице ознакомьтесь с правилами.

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