0

私はしばらくこの問題に取り組んできましたが、解決策が見つからないようです。私のアプリでは、ABAddressBook2 つの連絡先を同時に作成することはできないため、作成日から連絡先を一意に識別します。私のアプリでは、以下に示すように、作成日は という文字列に保存されuidます。2 つの連絡先が同じであるかどうかを確認しています。これは、次の条件ステートメントを実行することによって行います。

NSString *uid = @"some string";

if([(__bridge_transfer NSString *)ABRecordCopyValue(currentPersonRef, kABPersonCreationDateProperty) isEqualToString:uid]) {

    //Do some code
}

ただし、このコードを実行すると、次のエラーが発生します。

[__NSDate isEqualToString:]: 認識されないセレクターがインスタンス 0x8c7c770 に送信されました

問題は、によってキャストされていない NSDate オブジェクトを返すことだと確信しているためABRecordCopyValue()、それをusingと比較すると、クラッシュします。問題は、それを NSString オブジェクトにキャストすることでうまくいくと思ったということです。私の質問は:NSString(__bridge_transfer NSString *)uidisEqualToStringisEqualToString:

(__bridge_transfer NSString *) が NSDate オブジェクトをキャストしないのはなぜですか?


編集:

提供された回答は役に立ちましたが、私の問題を完全に解決するものではありません (実際にはそうですが、フォローアップの質問があります)。コードの別の部分で、これを実行します。

NSString *uid = (__bridge_transfer NSString *)ABRecordCopyValue(currentPerson, kABPersonCreationDateProperty);

NSLoguidを実行すると、次のようになります。

2012-10-28 21:55:29 +0000

うまくいかないuid場合、上記の条件ステートメントでどのように比較しますか?isEqualToString:

4

2 に答える 2

5

キャストによってオブジェクトのクラスや型が変更されることはありません。これは、コンパイラーが想定するよりも、このオブジェクトが別の型であるという事実を確信していることをコンパイラーに伝えるだけです。

したがって、日付オブジェクトを文字列にキャストしても、それは日付オブジェクトのままです。

OOP では通常、アップキャストが必要です。メソッドはオブジェクトを渡す必要がありますが、実際にはサブクラスのオブジェクトを渡します。サブクラスによって定義されたプロパティまたはメソッドにアクセスする必要がある場合は、キャストによってサブクラスのオブジェクトがあることをコンパイラに伝えます。
iOS での非常に一般的な例はtableview:cellForRowAtIndexPath:、サブクラス化されたセルです。

cocoa(-touch) では、 toll-free ブリッジングからのキャストも知っています。有効なキャストについては、このドキュメントを参照してください。


提供された回答は役に立ちましたが、私の問題を完全に解決しているわけではありません (実際にはそうですが、フォローアップの質問があります)。コードの別の部分で、これを実行します。

NSString *uid = (__bridge_transfer NSString *)ABRecordCopyValue(currentPerson, kABPersonCreationDateProperty);

NSLog uid の場合、次のようになります。

2012-10-28 21:55:29 +0000

NSString であると宣言する変数を作成していますが、実際に割り当てるオブジェクトは日付オブジェクトです。

NSDate *uidDate = (__bridge_transfer NSDate *)ABRecordCopyValue(currentPerson, kABPersonCreationDateProperty);

NSString *uid = [NSString stringWithFormat:uidDate];
于 2012-10-29T02:40:35.640 に答える
0

あなたの質問に対する答えはわかりませんが、ABRecordCopyValue() を NSString に変換してから、isStringEqual: を実行してみませんか?

お気に入り -

NSString *string = [NSString stringWithFormat:@"%@", ABRecordCopyValue(currentPersonRef, kABPersonCreationDateProperty)];
if([string isEqualToString: uid]){
    //do your thing
}
于 2012-10-29T02:35:05.493 に答える