Странная проблема с использованием UINib / указателя, идущего AWOL - PullRequest
4 голосов
/ 17 сентября 2010

У меня что-то странное происходит с использованием UINib, хотя я подозреваю, что настоящая проблема может быть похоронена в другом месте.

Мое приложение использует просмотр таблицы, содержимое ячеек было подготовлено в Интерфейсном Разработчике из-за их сложности. Для новых ячеек (в отличие от повторно используемых) содержимое пера создается с использованием UINib Class . Поскольку для всех ячеек используется только один кончик, и чтобы уменьшить накладные расходы при загрузке файла каждый раз, я добавил UINib как свойство cellNib в мой подкласс viewcontroller, который я загружаю один раз в своей реализации viewDidLoad.

Теперь о странной части. Все работает нормально, табличное представление заполнено данными, и все ячейки настроены с содержимым пера, как и должно быть. Но как только я прокручиваю таблицу, приложение вылетает.
Коллстэк дал это: - [NSCFNumber instantiateWithOwner: options:]: нераспознанный селектор, отправленный на экземпляр Очевидно, что сообщение о создании экземпляра содержимого из cellNib снова было отправлено не тому объекту. Объект, которому отправляется сообщение, время от времени отличается, поэтому происходит что-то случайное.

Я не понимаю - почему это работает примерно 10 раз при загрузке таблицы, но больше не при прокрутке таблицы?

Если я создаю новый экземпляр UINib каждый раз (как видно из моего кода ниже), то все работает просто отлично, включая прокрутку.

Где я могу ошибиться? Указатель моего свойства UINib становится ненастоящим? Если так, то почему?

Вот код, который я использую (я удалил всю загрузку данных и другие вещи, чтобы их было легче читать):

@interface NTDPadViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {

   NSManagedObjectContext *managedObjectContext;
   NSMutableArray *ntdArray;
   IBOutlet UITableView *ntdTableView;
   UINib *cellNib;

}

@property(nonatomic,retain) NSManagedObjectContext *managedObjectContext;
@property(nonatomic,retain) NSMutableArray *ntdArray;
@property(nonatomic,retain) UITableView *ntdTableView;
@property(nonatomic,retain) UINib *cellNib;

@end

Реализация:

@implementation NTDPadViewController

@synthesize managedObjectContext;
@synthesize ntdArray;
@synthesize ntdTableView;
@synthesize cellNib;

-(void)viewDidLoad {

   [super viewDidLoad];
   cellNib = [UINib nibWithNibName:@"NTDCell" bundle:nil];

}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

   static NSString *CellIdentifier = @"Cell";

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

       [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
       [cell setBackgroundColor:[UIColor clearColor]];

       // These two should work equally well. But they don't... of course I'm using only one at a time ;)
       // THIS WORKS:
       UINib *test = [UINib nibWithNibName:@"NTDCell" bundle:nil];
       NSArray *nibArray = [test instantiateWithOwner:self options:nil];

       // THIS DOESN'T WORK:
       NSArray *nibArray = [cellNib instantiateWithOwner:self options:nil];

       [[cell contentView] addSubview:[nibArray objectAtIndex:0]];

   }

   return cell;
}

Большое спасибо !!

1 Ответ

7 голосов
/ 17 сентября 2010

Эта строка назначает autorelease d экземпляр для cellNib:

cellNib = [UINib nibWithNibName:@"NTDCell" bundle:nil];

Это означает, что со следующей строкой:

NSArray *nibArray = [cellNib instantiateWithOwner:self options:nil];

... cellNib уже освобожден, когда связанный с ним пул автоматического выпуска был истощен, и его использование приведет к неопределенному поведению.

Если вы хотите, чтобы cellNib оставался рядом, вступите во владение им, например, используя объявленное свойство:

self.cellNib = [UINib nibWithNibName:@"NTDCell" bundle:nil];
...