2011-01-24 5 views
1

私の配列の割り当てが解除されているためクラッシュしていますが、理由や場所はわかりません。配列は、このようなものから来ている:NSArrayを返すときにクラッシュします

@implementation Sources 

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

@end 

次に、テーブルビューでは、私はそうのようなゲッターをオーバーライドする性質があります。

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

をそして私はこのようなプロパティを呼び出しますこれによりクラッシュが発生します。

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

なぜアレイが割り当て解除されているのかわかりません。それは私が気づいていないどこかで流出されているオートリリースプールですか?この配列を保持する正しい方法は何ですか?

+2

ところで、ここにキャストする必要はありません:return(NSArray *)array; –

答えて

6

はあなたのゲッターは次のようになります。

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

ザ・が-sourceArrayからNSArrayを返されたことがときNSAutoreleasePoolドレイン割り当てが解除されているのでは、を自動解放されます。 -retainを呼び出すことによって、返されたオブジェクトの所有権を取得する必要があります。

+3

このようなパターンには脆弱性があります。つまり、ゲッター内の状態が変化しているため、ゲッターが取得している間に変更が発生したという事実に対処できない実行段階で、変更が表示されないか、変更が表示されることがあります。一般的に、このスタイルの遅延初期化は避けるのが最善の方法です。 – bbum

+0

@bbum確かに。 –

+0

それでは、init配列のソース配列を初期化する方がよいでしょうか?つまり、それは怠惰ではありませんか? – rob

関連する問題