NSMutableArray становится нулевым после reloadData - PullRequest
2 голосов
/ 13 июля 2010

В разрабатываемом приложении для iPhone я извлекаю набор данных из веб-службы, сохраняю их в непостоянном массиве для отображения в таблице, а также сохраняю в основных данных в качестве резервной копии при отсутствии сети.

Мой массив инициализируется в приложении: didFinishLaunchingWithOptions: следующим образом
tableArray = [[NSMutableArray alloc] initWithCapacity:100];
массив затем заполняется после вызова viewDidLoad, то есть существует UITableView (проверяется проверкой отладчика) и непосредственно передвызывается reloadData, у меня NSLog распечатывает содержимое массива и, конечно же, все там есть.

Моя проблема в том, что после вызывается reloadData, tableArray становится нулевым, как показаноNSLog в tableView: numberOfRowsInSection:.

Я в полной растерянности относительно того, почему это происходит, хотя я программировал в Какао всего несколько месяцев и мог легко упустить что-то очевидное.

РЕДАКТИРОВАТЬ: Обновлено с основным кодом.

@interface MyAppDelegate : NSObject {<br> ...<br> NSMutableArray *tableArray;<br> }<br> @property (nonatomic, retain) NSMutableArray *tableArray;<br> ...<br> @end

@implementation MyAppDelegate<br> @synthesize tableArray

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    tableArray = [[NSMutableArray alloc] initWithCapacity:100];

    masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:[NSBundle mainBundle]];
    [masterViewController.tableView setDelegate:self];
    [masterViewController.tableView setDataSource:self];
    ...
}

Метод называется ruЗатем nWithNetwork вызывается в viewDidLoad masterViewController:

- (void)runWithNetwork {
    ...
    NSArray *backpackArray = [[mainDict objectForKey:@"items"] objectForKey:@"item"];
    NSLog(@"%i", [backpackArray count]);
    for (int a=0; a<[backpackArray count]; a++) {
    NSDictionary *itemDict = [backpackArray objectAtIndex:a];
        NSString *ID = [[itemDict valueForKey:@"defindex"] stringValue];
        NSString *level = [[itemDict valueForKey:@"level"] stringValue];
        NSString *quality = [[itemDict valueForKey:@"quality"] stringValue];
        NSString *inventory = [[itemDict valueForKey:@"inventory"] stringValue];
        NSNumber *uid = [NSNumber numberWithInt:a];

        //Insert new
        myItem = [NSEntityDescription insertNewObjectForEntityForName:@"Backpack" inManagedObjectContext:managedObjectContext_];
        [myItem setValue:level forKey:@"level"];
        [myItem setValue:inventory forKey:@"inventory"];
        [myItem setValue:quality forKey:@"quality"];
        [myItem setValue:uid forKey:@"uid"];

        //Link to item db
        NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id == %@", ID];
        [fetch setEntity:[NSEntityDescription entityForName:@"GlobalItems" inManagedObjectContext:managedObjectContext_]];
        [fetch setPredicate:predicate];

        item = [[managedObjectContext_ executeFetchRequest:fetch error:nil] objectAtIndex:0];
        [myItem setValue:item forKey:@"item"];

        [tableArray addObject:[item valueForKey:@"name"]]; //a series of nsstrings

    }
    NSLog(@"%@, %i", tableArray, [tableArray retainCount]); // all strings are printed correctly here, retaincount is 1

    [masterViewController.tableView reloadData];
}

Затем я перехожу к моим методам таблицы:

- (NSInteger)tableView:(UITableView *)tView numberOfRowsInSection:(NSInteger)section {  
    NSLog(@"%@, %i", tableArray, [tableArray retainCount]);  //(null) printed, 0 for retaincount
    return [tableArray count];  //returns 0
}

TableView находится в XIB MasterViewController и там корректно связан.Это только когда-либо описано в MasterViewController и настроено как IBOutlet.tableArray описывается только в MyAppDelegate.h и больше нигде не создается.

Ответы [ 2 ]

1 голос
/ 13 июля 2010

Ваш tableArray не сохраняется, потому что вы не используете свой аксессор для его установки. Изменения:

tableArray = [[NSMutableArray alloc] initWithCapacity:100];

до:

[self setTableArray:[[NSMutableArray alloc] initWithCapacity:100]];
1 голос
/ 13 июля 2010

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

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