2011-11-22 5 views
1

私はiVarをNSIndexPathオブジェクトとして宣言していますが、didSelectRowAtIndexPathにNSArrayオブジェクトとして表示されているアプリケーションを開発しています。それがどのように示されるのか、私の側からの間違いは何ですか。 私を助けてください。 ありがとうございます。NSIndexPathオブジェクトはNSArrayオブジェクトとして表示されますか?

サンプルコード:

//.h file: 
NSIndexPath *lastIndexPath; 

//.m file: 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 

     if([[default1 objectForKey:@"keyToRepeatString"] isEqualToString:[arrayRepeat objectAtIndex:i]]) 
     { 
      lastIndexPath=indexPath; 
      repeatString=[default1 objectForKey:@"keyToRepeatString"]; 
     } 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
int newRow = [indexPath row]; 
    int oldRow = [lastIndexPath row]; 
} 

    int oldRow = [lastIndexPath row];........//Here lastIndexPath shows as NSArray obj? 
+2

NSIndexまたはNSIndexPath? – Ilanchezhian

+1

いくつかのサンプルコードを投稿してください。 – maheswaran

+0

あなたの象牙を保持することを忘れているかもしれませんか? –

答えて

1

は、メモリ管理の問題のように見える:

lastIndexPath=indexPath 

ラインがたむろしindexPathを教えてくれない:)

あなたは

[lastIndexPath autorelease]; 
lastIndexPath = [indexPath retain]; 

まず、以前のlastIndexPathには、完了したことがすべて通知されます。次に、indexPathに割り当て解除されないように指示し、メモリが他のもの(あなたの場合はNSArray)に使用されないようにします。

+0

TanQ Verymuch ....それはうまくいっています... TanQ ... TanQ –

0

あなたはポインタはポインタアドレスを入力する内容物とはほとんど関係がない宣言する方法。 Objective-Cは非常に緩やかに型付けされているので、コンパイラの非常に弱い型チェックが文句を言わないように代入を難読化する限り、UIViewControllerのアドレスをNSStringポインタに割り当てることができます。

だから、NSIndexPathポインタにNSArrayのアドレスを割り当てることができますし、値を使用しようとするまで、何も起こりません。

また、Aliaksandrが示唆しているように、保持する必要のあるものを保持しないと、アドレスの「背後にある」オブジェクトは割り当てが解除され、全く別のものとして再割り当てされる可能性があります。 (この問題は特にタイミング/シナリオに依存し、エミュレータでは動作しますが、ハードウェアでは動作しないなどの結果になる可能性があります)

私は非常に似た問題を昨日持っていましたそれ以外は不思議なことに失敗し始めた)。私はNSLogにコードの複数の場所でポインタのdescriptionretainCountを取得する必要があったため、変更された理由とその理由を検出しました。 (問題は、プロパティが不適切に別のクラスにassignを宣言されました。)

関連する問題