2011-01-24 140 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

顺便说一句,不需要在这里强制转换:`return(NSArray *)array;` – 2011-01-24 23:00:39

回答

6

你消气应该是这样的:

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

返回NSArray-sourceArray自动释放,让被释放的NSAutoreleasePool水渠时。您需要通过调用-retain来获取返回的对象的所有权。

+3

请注意,这样的模式确实具有脆弱性。也就是说,你正在改变吸气剂中的状态,因此,观察者可能看不到改变,或者在执行阶段看到改变,无法处理吸气剂越来越变化的事实。通常,这种惰性初始化的风格通常是最好的避免。 – bbum 2011-01-24 22:34:10