我好像找到了解决办法 . 在我的应用程序中,我通过创建日期唯一地标识来自 ABAddressBook
的联系人,因为不能同时创建两个联系人 . 在我的应用程序中,创建日期存储在名为 uid
的字符串中,如下所示 . 我正在检查两个联系人是否相同,我通过执行以下条件语句来执行此操作:
NSString *uid = @"some string";
if([(__bridge_transfer NSString *)ABRecordCopyValue(currentPersonRef, kABPersonCreationDateProperty) isEqualToString:uid]) {
//Do some code
}
但是,当我运行此代码时,我收到以下错误:
[__NSDate isEqualToString:]:无法识别的选择器发送到实例0x8c7c770
我很确定问题是 ABRecordCopyValue()
正在返回一个未被 (__bridge_transfer NSString *)
转换为 NSString
的NSDate对象,因此当我使用 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
那么如果 isEqualToString:
不起作用,我将如何比较上述条件语句中的 uid
?
2 回答
强制转换永远不会更改对象的类或类型 . 它只是告诉编译器,你确定这个对象是另一种类型的事实,而不是编译器可能假设的那样 .
因此,如果将日期对象强制转换为字符串,它仍将是日期对象 .
在OOP中,您通常需要向上转换:一个方法希望您传入一个对象,但实际上您传入了一个子类的对象 . 如果您需要访问由子类定义的属性或方法,您将通过强制转换告诉编译器您有子类的对象 .
iOS中一个非常常见的例子是带有子类化单元格的
tableview:cellForRowAtIndexPath:
.在cocoa(-touch)中你也知道从toll-free bridging进行的转换 . 有关有效的演员表,请参阅此文档 .
您正在创建一个声明为NSString的变量,但实际上您指定给它的对象是一个日期对象 .
好吧,我不知道你的问题的答案,但为什么不把ABRecordCopyValue()转换为NSString,然后做isStringEqual:?
喜欢 -