2010-09-17 5 views
4

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

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

Теперь для странной части. Все работает нормально, tableview заполняется его данными, и все ячейки настроены с содержимым ниба, как и должно быть. Но как только я просматриваю табличное представление, приложение аварийно завершает работу.
Callstack дал этому: - [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; 
} 

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

ответ

7

Эта строка присваивает экземпляр autorelease d к cellNib:

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

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

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

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

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

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

Вы абсолютно правы. Теперь работает. Не могли бы вы объяснить, почему существует разница между cellNib = и self.cellNib =? Я всегда думал в контексте объекта, ссылающегося на свойство через себя. был «факультативным» ... (глупым мной) – Toastor

+0

@Тоастор: Эти два варианта делают совершенно разные вещи. 'self.cellNib = ...' - это «точечный синтаксис», который вызывает установщик, который в вашем случае сохраняется. 'cellNib = ...' просто прямо присваивает ivar, перезаписывая предыдущее значение указателя. См. Раздел [объявленные свойства] (http://developer.apple.com/library/mac/# documentation/cocoa/conceptual/objectivec/Articles/ocProperties.html) в документах Apple. –

+0

Отлично! Еще раз спасибо! – Toastor

 Смежные вопросы

  • Нет связанных вопросов^_^