2011-01-07 8 views
1

私はテーブルビューコントローラを持っており、その初期化中にテーブルのデータを表示するためにcellForRowAtIndexPathメソッドで使用されるNSArrayプロパティを設定しました。保持されたプロパティを呼び出すと、TableViewControllerがクラッシュしますか?

しかし、私が行をタッチすると、これを保持しているNSArrayプロパティをEXC_BAD_ACCESSと呼ぶと!

FYIプロパティは、以下のように定義され、カスタムゲッター機能使用されています

@property (nonatomic,retain) NSArray *dataList; 

と.mファイル内:

@synthesize dataList; 

- (NSArray *)dataList 
{ 
    if (!dataList) 
    { 
     NSString *p = [kind lowercaseString]; 
     NSString *s = [[NSBundle mainBundle] pathForResource:p ofType:@"txt"]; 
     NSLog(@"%@",s); 

     NSData *dataRep = [NSData dataWithContentsOfFile:s]; 
     NSPropertyListFormat format; 
     dataList = [NSPropertyListSerialization propertyListFromData: dataRep 
                mutabilityOption: NSPropertyListImmutable 
                   format: &format 
                errorDescription: nil]; 
     if (dataList.count == 0) 
      NSLog(@"Fetch failed!"); 
    } 

    return dataList; 
} 

任意の提案を?

+0

を?あなたのカスタムゲッター機能など? – GendoIkari

+0

ここにコードを投稿する必要があります。オーバーライドされたgetter/setterを持っているか、配列の保持カウントを他の場所で誤って処理しています。 –

+0

代わりにコピープロパティにすることもできます。これは、プロパティにNSMutableArrayを代入して配列を突然変異させると、配列のプロパティのバージョンが変更されないことを意味します。代わりに非可変NSArrayを代入すると、コピーはretainのように動作します。 –

答えて

3

これは問題である。

dataList = [NSPropertyListSerialization propertyListFromData ... 

この関数は、したがって、それは自動解放オブジェクトを返し、alloccopy、又はretainで始まりません。ただし、それが保持されるようにする必要があります。

次の2つのオプションがあります:あなたはより多くのコードを投稿することができ

self.dataList = [NSPropertyListSerialization propertyListFromData ... 

または、

dataList = [[NSPropertyListSerialization propertyListFromData ...] retain]; 
+0

ありがとうございます。私はあなたのポイントを完全に理解していますが、(私はそれが設定された時点で別のNSArrayに値をコピーすることで回避すると思います。 self.myProperty? – nosuic

+0

これは重要な部分の一部ですが、 'myProperty'はインスタンス変数*に直接アクセスしていますが、' self.myProperty'は合成されたgetter/setterメソッドを経由しています。 '@property(retain)'と '@ synthesize'を使って、' self.myProperty = ... 'で値を代入するとそのオブジェクトは自動的に保持されますが、ここでのカスタムメソッドでは、インスタンス変数。まずそれを保持する必要があります。 – jtbandes

関連する問題