为什么这个类型不适用?

pas*_*aya 0 crash objective-c nsdate abaddressbook ios

我一直在研究这个问题,似乎无法找到解决方案.在我的应用程序中,我ABAddressBook通过创建日期唯一地标识联系人,因为不能同时创建两个联系人.在我的应用程序中,创建日期存储在一个名为的字符串中uid,如下所示.我正在检查两个联系人是否相同,我通过执行以下条件语句来执行此操作:

NSString *uid = @"some string";

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

    //Do some code
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行此代码时,我收到以下错误:

[__NSDate isEqualToString:]:无法识别的选择器发送到实例0x8c7c770

我敢肯定,问题是,ABRecordCopyValue()返回了不被强制转换为一个NSDate对象NSString(__bridge_transfer NSString *),所以当我把它比作uidisEqualToString,它崩溃.问题是,我认为通过将其转换为NSString对象,isEqualToString:可行.我的问题是:

为什么(__bridge_transfer NSString*)没有强制转换NSDate对象?


编辑:

提供的答案很有用,但它们并没有完全解决我的问题(实际上他们确实如此,但我有一个后续问题).在我的代码的另一部分,我运行这个:

NSString *uid = (__bridge_transfer NSString *)ABRecordCopyValue(currentPerson, kABPersonCreationDateProperty);
Run Code Online (Sandbox Code Playgroud)

如果我NSLog uid我得到这个:

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

那么uid如果isEqualToString:不起作用,我将如何在上述条件语句中进行比较?

Vik*_*ica 5

强制转换永远不会更改对象的类或类型.它只是告诉编译器,你确定这个对象是另一种类型的事实,而不是编译器可能假设的那样.

因此,如果将日期对象强制转换为字符串,它仍将是日期对象.

在OOP中,您通常需要向上转换:一个方法希望您传入一个对象,但实际上您传入了一个子类的对象.如果您需要访问由子类定义的属性或方法,您将通过强制转换告诉编译器您有子类的对象.
iOS中一个非常常见的例子是tableview:cellForRowAtIndexPath:子类化单元格.

在可可(-touch)你也知道从免费桥接铸造.有关有效的演员表,请参阅此文档.


提供的答案很有用,但它们并没有完全解决我的问题(实际上他们确实如此,但我有一个后续问题).在我的代码的另一部分,我运行这个:

NSString *uid = (__bridge_transfer NSString *)ABRecordCopyValue(currentPerson, kABPersonCreationDateProperty);
Run Code Online (Sandbox Code Playgroud)

如果我NSLog uid我得到这个:

2012-10-28 21:55:29 +0000
Run Code Online (Sandbox Code Playgroud)

您正在创建一个变量,您声明它是一个NSString,但实际上您分配给它的对象是一个日期对象.

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

NSString *uid = [NSString stringWithFormat:uidDate];
Run Code Online (Sandbox Code Playgroud)