为什么这个类型不适用?

时间:2012-10-29 02:27:28

标签: objective-c ios crash nsdate abaddressbook

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

NSString *uid = @"some string";

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

    //Do some code
}

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

  

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

我很确定问题是ABRecordCopyValue()正在返回一个未被NSString转换为(__bridge_transfer NSString *)的NSDate对象,所以当我将它与{{1}进行比较时使用uid,它崩溃了。问题是,我认为通过将其转换为NSString对象,isEqualToString将起作用。我的问题是:

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


编辑:

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

isEqualToString:

如果我NSLog NSString *uid = (__bridge_transfer NSString *)ABRecordCopyValue(currentPerson, kABPersonCreationDateProperty); 我得到了这个:

  

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

那么,如果uid不起作用,我将如何比较上述条件语句中的uid

2 个答案:

答案 0 :(得分:5)

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

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

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

在cocoa(-touch)中你也知道来自toll-free bridging的强制转换。有关有效的演员表,请参阅此文档。


  

提供的答案很有用,但并不完全   解决我的问题(实际上他们确实这样做了,但我有一个跟进   题)。在我的代码的另一部分,我运行:

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

如果我是NSLog,我会得到这个:

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

您正在创建一个声明为NSString的变量,但实际上您指定给它的对象是一个日期对象。

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

NSString *uid = [NSString stringWithFormat:uidDate];

答案 1 :(得分:0)

好吧,我不知道你问题的答案,但为什么不把ABRecordCopyValue()转换为NSString,然后执行isStringEqual:?

喜欢 -

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