1

iVar を NSIndexPath オブジェクトとして宣言したアプリケーションを 1 つ開発していますが、didSelectRowAtIndexPath では 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?
4

2 に答える 2

1

メモリ管理の問題のように見えます:

lastIndexPath=indexPath

その行は、indexPathにぶらぶらするように指示していません:)

代わりにこれを置く必要があります:

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

最初に、以前の lastIndexPath に、それが完了したことを伝えます。次に、indexPath の割り当てを解除しないように指示するため、メモリは他の目的 (この場合は NSArray) には使用されません。

于 2011-11-22T12:33:49.383 に答える
0

ポインターを宣言する方法は、ポインターがアドレス指定するオブジェクトの種類とはほとんど関係ありません。Objective-C は非常に緩く型付けされており、たとえば UIViewController アドレスを NSString ポインターに割り当てることができます。ただし、割り当てを難読化して、コンパイラでの非常に弱い型チェックで問題が発生しないようにする必要があります。

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

また、Aliaksandr が示唆したように、保持すべきものを保持できなかった場合、アドレスの「背後にある」オブジェクトの割り当てが解除され、まったく別のものとして再割り当てされる可能性があります。(この問題は特にタイミング/シナリオに依存し、たとえば、エミュレータでは機能するがハードウェアでは失敗するコードになる可能性があります。)

私は昨日、非常によく似た問題を抱えていました (不思議なことに失敗し始めた他の誰かによって書かれた古いコードのバグ)。どのような状況で変更されたのか、その理由を検出するために、コードを介して複数の場所でポインターdescriptionをNSLog する必要がありました。(問題は、別のクラスでretainCount不適切に宣言されたプロパティでした。)assign

于 2011-11-22T12:29:51.680 に答える