2012-10-29 99 views
0

我一直在處理這個問題一段時間,似乎無法找到解決方案。在我的應用程序中,我根據其創建日期唯一標識了ABAddressBook中的聯繫人,因爲沒有兩個聯繫人可以同時創建。在我的應用程序中,創建日期存儲在名爲uid的字符串中,如下所示。我檢查,看看兩個觸點是相同的,而我通過執行以下條件語句做到這一點:爲什麼這種類型轉換不適用於自己?

NSString *uid = @"some string"; 

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

    //Do some code 
} 

然而,當我運行此代碼,我得到以下錯誤:

[__NSDate isEqualToString:]: unrecognized selector sent to instance 0x8c7c770

我敢肯定,問題是ABRecordCopyValue()正在返回一個NSDate對象沒有被鑄造到NSString(__bridge_transfer NSString *),所以當我使用isEqualToString比較它uid,它崩潰。事情是,我認爲通過將它投射到一個NSString對象,isEqualToString:將工作。我的問題是:

爲什麼(__bridge_transfer NSString *)不投射NSDate對象?


編輯:

提供的是有用的答案,但他們沒有完全解決我的問題(其實很好他們這樣做,但我有一個跟進的問題)。在我的代碼另一部分,我運行此:

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

如果我的NSLog uid我得到這個:

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

因此,如何將我在上面的條件語句比較uid如果isEqualToString:不工作?

+0

你在問kABPersonCreationDateProperty,它總是會返回一個CFDateRef,無論你如何聲明它。如果你需要它作爲NSString,你需要先轉換它,然後在其上運行'isEqualToString'。 – Rog

回答

5

的鑄造永不改變的對象的類別或類型。它只是告訴編譯器,你確信這個對象是另一種類型,而不是編譯器可能會採用的。

因此,如果您將日期對象轉換爲字符串,它仍然是日期對象。

在OOP中,通常需要上傳:一種方法希望你傳入一個對象,但實際上你傳入了一個子類的對象。如果您隨後需要訪問由子類定義的屬性或方法,那麼您將通過轉換告訴編譯器,您擁有子類的對象。
iOS中的一個非常常見的例子是tableview:cellForRowAtIndexPath:和子類別的單元格。

在可可( - 觸摸)你也知道鑄造從​​。請參閱此文檔以獲取有效的演員表。


The answers provided have been useful, but they do not completely address my problem (well actually they do, but I have a follow-up question). In another part of my code, I run this:

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

And if I NSLog uid I get this:

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

您正在創建一個變量,聲明是一個NSString,但實際上對象分配給它,是一個Date對象。

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

NSString *uid = [NSString stringWithFormat:uidDate]; 
+0

對於指針來說這是真的,但對於像int這樣的基本類型來說,類型將會爲你改變。 –

+0

那麼如何將CFDateRef與NSString('uid')進行比較呢? – pasawaya

+0

實際上,知道格式轉到uid會有所幫助。但是您應該將返回的值轉換爲nsdate並進行比較。所以要麼你從uid創建一個nsdate,要麼從返回的日期創建一個nsstring。因爲我們不知道你需要的格式,所以很難說,應該怎麼做,因爲它可能涉及日期格式化程序。 – vikingosegundo

0

嗯,我不知道你的問題的答案,但爲什麼你不只是將ABRecordCopyValue()轉換爲NSString,然後做isStringEqual:?

象 -

NSString *string = [NSString stringWithFormat:@"%@", ABRecordCopyValue(currentPersonRef, kABPersonCreationDateProperty)]; 
if([string isEqualToString: uid]){ 
    //do your thing 
} 
+0

我試過了,但現在它崩潰了一個'EXC_BAD_ACCESS'錯誤。 – pasawaya

+0

這是將日期對象轉換爲字符串的最糟糕的方法。你正在依賴於'NSDate描述'的一個未記錄的,可改變的實現。更糟的是,你甚至沒有NSDate。你得到一個CFDateRef。使用NSDateFormatter將日期轉換爲字符串,或將字符串轉換爲日期。 – rmaddy

+0

感謝您的洞察力。我會記住這一點。如果你希望看到你的見解,你應該把它放在公認的答案上,因爲他也使用了stringWithFormat(但是他橋接了CFDateRef,我忘記了)。 – yeesterbunny

相關問題