Объект выпущен слишком рано с iOS 5 ARC - PullRequest
1 голос
/ 21 октября 2011

Я новичок в языке программирования target-c и заметил странное поведение в управлении памятью. В iOS 5 ARC включен по умолчанию, но объект выпущен слишком рано, может быть, кто-то может дать мне какой-нибудь совет.

Это тот случай:

У меня есть объект Dao, который извлекает данные из базы данных SQLite с помощью Core Data PersistenceStore. Этот Дао реализует метод "getAllAuthors"

В моем viewController в методе viewWillAppear я загружаю эти данные, и данные загружаются, но когда я заполняю tableView, объекты равны (null).

Выкладываю код:

@synthesize authors;
@synthesize authorsTable;
@synthesize dao;

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

#pragma mark - View lifecycle

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"author in viewDidLoad: %@", [[authors objectAtIndex:0] name]);
}

- (void)viewDidUnload {
    [super viewDidUnload];
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    dao = [[CrossoverDao alloc] init];
    authors = [NSArray arrayWithArray:[dao getAllAuthors]];
    [authorsTable reloadData];
    NSLog(@"author in viewWillAppear: %@", [[authors objectAtIndex:0] name]);
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [authorsTable reloadData];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"author in viewWillDisappear: %@", [[authors objectAtIndex:0] name]);
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    NSLog(@"author in viewDidDisappear: %@", [[authors objectAtIndex:0] name]);
}

- (BOOL)shouldAutorotateToInterfaceOrientation:    (UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

#pragma mark -
#pragma mark UITableViewDataSource datasource

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath {
    NSLog(@"[AuthorsViewController::cellForRowAtIndexPath] Constructing row at indexPath: %d",     indexPath.row);
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView 
                             dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        if(indexPath.section == 0)
            cell = [[UITableViewCell alloc]     initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:CellIdentifier];
        else
            cell = [[UITableViewCell alloc]     initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
    }
    cell.textLabel.text = [[authors objectAtIndex:indexPath.row] name];
    cell.detailTextLabel.text = [[authors objectAtIndex:indexPath.row] bio];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    return cell;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section {
    NSLog(@"author in numberOfRowsInSection: %@", [[authors objectAtIndex:0] name]);
    return [authors count];
}

В cellForRowAtIndexPath автор имеет значение null. Любая подсказка?

Заранее спасибо

Ответы [ 3 ]

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

Вы должны убедиться, что вы установили свои свойства, используя синтезированные средства доступа, чтобы ARC знал, что вы хотите сохранить их, если они сильные (здесь он только что вставил релизы в конце вашего viewWillAppear метода). Изменение

dao = [[CrossoverDao alloc] init];
authors = [NSArray arrayWithArray:[dao getAllAuthors]];

до

self.dao = [[CrossoverDao alloc] init];
self.authors = [NSArray arrayWithArray:[dao getAllAuthors]];
1 голос
/ 21 октября 2011
dao = [[CrossoverDao alloc] init];
authors = [NSArray arrayWithArray:[dao getAllAuthors]];
[authorsTable reloadData];
NSLog(@"author in viewWillAppear: %@", [[authors objectAtIndex:0] name]);

Это должно быть сделано в методе viewDidLoad или loadView вашего контроллера. В viewWillAppear вы обычно просто запрашиваете обновление пользовательского интерфейса.

0 голосов
/ 21 октября 2011

Я не использовал ios5 ARC, но, возможно, не могли бы вы попробовать сохранить в viewWillAppear и выпустить в viewWillDisappear?

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