В разрабатываемом приложении для 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 и больше нигде не создается.