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