Почему в этом случае я получаю сообщение об ошибке в удаленном экземпляре? - PullRequest
0 голосов
/ 10 июля 2011

Я пытаюсь отсортировать NSMutableArray на основе объекта, который он содержит. Я получаю сообщение об ошибке в этой строке в следующем фрагменте кода:

InboxItem * ptrInboxItem =  [sortedInboxFaxItems objectAtIndex:[indexPath row]];

#import <UIKit/UIKit.h>
@class InboxItem;


@interface InboxTableViewController : UITableViewController<NSXMLParserDelegate> {
    NSMutableArray *inboxFaxItems;
    NSArray * sortedInboxFaxItems;
    InboxItem *_inboxItem;

    NSMutableData *xmlData;
    NSURLConnection *connectionInprogress;
    NSMutableString *inboxFaxesString;
    UIActivityIndicatorView *activityIndicator;
}

@property(nonatomic,retain) InboxItem * inboxItem;

-(void) loadInbox;

@end

- (void) connectionDidFinishLoading:(NSURLConnection *)connection{
    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:xmlData];
    [parser setDelegate:self];
    [parser parse];
    [parser release];

    //lets sort by messageID
    NSSortDescriptor *sortDescriptor;
    sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"messageID" ascending:YES] autorelease];
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    sortedInboxFaxItems = [inboxFaxItems sortedArrayUsingDescriptors:sortDescriptors]; 

    [[self tableView] reloadData];
    activityIndicator.stopAnimating;

    [connectionInprogress release];
    connectionInprogress = nil;

    [xmlData release];
    xmlData = nil;
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"InboxFaxItem";

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

    //I AM GETTING ERROR HERE
    InboxItem * ptrInboxItem =  [sortedInboxFaxItems objectAtIndex:[indexPath row]];

    [[cell textLabel]setText: ptrInboxItem.datetime];
    cell.imageView.image = [UIImage imageNamed:@"document.png"];
    return cell;
}

#pragma mark -
#pragma mark Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Navigation logic may go here. Create and push another view controller.

    MyManager *sharedManager = [MyManager sharedManager];
    InboxItem * ptrInboxItem =  [sortedInboxFaxItems objectAtIndex:[indexPath row]];

    sharedManager.pages = ptrInboxItem.pages;
    sharedManager.from =ptrInboxItem.from;

    FaxViewController *faxViewController = [[FaxViewController alloc] initWithNibName:@"FaxViewController" bundle:nil];
    faxViewController.messageid=ptrInboxItem.messageID;
    faxViewController.navigationItem.title=@"View Fax";
    [self.navigationController pushViewController:faxViewController animated:YES];
    [faxViewController release];
}

1 Ответ

1 голос
/ 10 июля 2011

Это из-за этой строки:

sortedInboxFaxItems = [inboxFaxItems sortedArrayUsingDescriptors:sortDescriptors];

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

Вы должны изменить эту строку следующим образом:

[sortedInboxFaxItems release]; // Release any previous value
sortedInboxFaxItems = [[inboxFaxItems sortedArrayUsingDescriptors:sortDescriptors] retain];

Все лучше.

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