2011-01-24 3 views
1

Я получаю сбой, потому что мой массив освобожден, но я не знаю, почему и где. Массив приходит от чего-то, что выглядит следующим образом:сбой при возврате NSArray

@implementation Sources 

- (NSArray *)sourceArray{ 
    NSMutableArray *array = [NSMutableArray array]; 
    //fill array with objects 
    return (NSArray*)array; 
} 

@end 

Затем в Tableview, У меня есть свойство, где я переопределить геттер следующим образом:

- (NSArray *)feedSourceList 
{ 
    if (!_sources) {  
     _feedSourceList = [_sourceList sourceArray]; 
    } 
    return _sources; 
} 

И тогда я называю свойство, как это , и это вызывает сбой:

- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [self.feedSourceList count]; 
} 

Я не знаю, почему массив освобождается. Является ли это резервным пулом, где я не знаю? Каков правильный способ сохранения этого массива?

+2

BTW, нет необходимости использовать здесь: 'return (NSArray *) array;' –

ответ

6

Ваш поглотитель должен выглядеть следующим образом:

- (NSArray *)feedSourceList 
{ 
    if (!_sources) {  
     _sources = [[_sourceList sourceArray] retain]; 
    } 
    return _sources; 
} 

NSArray Возвращенный из -sourceArray является autoreleased, так что в настоящее время освобождаться, когда NSAutoreleasePool водостоки. Вам нужно взять собственность на возвращаемый объект, вызвав -retain.

+3

Обратите внимание, что такой шаблон имеет хрупкость. А именно, вы меняете состояние в getter, и, таким образом, наблюдатель может не видеть изменения или увидеть изменения во время этапа выполнения, которые не могут иметь дело с тем фактом, что это изменение произошло во время получения getter. Как правило, этот стиль ленивой инициализации часто лучше всего избегать. – bbum

+0

@bbum Определенно. –

+0

Итак, лучшим решением было бы инициализировать массив источников в массиве init? То есть сделать это не ленивым? – rob

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