如何从传入的整数和id中获取NSDate?

时间:2011-01-10 17:02:38

标签: iphone objective-c casting nsdate

这让我疯了,所以我希望有人可以帮助Objective-C noob解决这个问题。这是交易:

我正在使用Titanium Appcelerator开发iPhone应用程序,我正在尝试在XCode中创建一个附加模块,允许我将事件发送到iPhone日历。我想做的是按照自2001年1月1日(格林威治标准时间)以来的秒数计算日期和时间,并将其直接发送到日历,而不必弄乱看起来总是返回的字符串到目前为止的东西。不合时机。到目前为止,我无法将整数存入事件日期字段,这两个字段都是NSDate类型。

Titanium从Javascript获取参数并将其编译为目标代码,因此我可以像这样调用我的“cal”对象:

var startDate = 316367923;
var endDate = 316367923;    
var results = cal.newEvent(startTime,endTime)

。 。 。这就是“cal”对象接收该调用的方式:

-(BOOL)newEvent:(id)args {
    id startDate = [args objectAtIndex:0];
    id endDate = [args objectAtIndex:1];
    ...

我希望将这些整数放入事件对象中:

EKEventStore *eventDB = [[EKEventStore alloc] init];
EKEvent *theEvent  = [EKEvent eventWithEventStore:eventDB];
...
theEvent.startDate = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate: (int) startDate];
theEvent.endDate   = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate: (int) endDate];

这个编译没有任何错误,但导致我的应用程序爆炸,所以我想我的理解中缺少了一些东西。知道我哪里出错了吗?

谢谢,

标记

4 个答案:

答案 0 :(得分:6)

很可能'args'是一个NSArray,因此startDate和endDate是对象,而不是文字。你可能想做类似的事情:

theEvent.startDate = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:[startDate intValue]];

如果是startDate是一个NSNumber。否则,请查看Titanium文档以找出传入的数字类型。

答案 1 :(得分:0)

这可能不是导致崩溃的原因,但initWithTimeIntervalSinceReferenceDate NSDate方法期望NSTimeInterval(定义为typedef double NSTimeInterval)不是整数。

即:它的方法签名是:

- (id)initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)seconds

答案 2 :(得分:0)

我敢打赌startDate和endDate正在转换为NSNumber对象而不是整数。因此,请尝试以下几行:

theEvent.startDate = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate: (int) [startDate intValue]];
theEvent.endDate   = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate: (int) [endDate intValue]];

答案 3 :(得分:0)

我怀疑你的崩溃与它有什么关系但是,你可能会泄漏。这些行:

theEvent.startDate = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate: (int) startDate];
theEvent.endDate   = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate: (int) endDate];

分配一个保留计数为1的对象,如果startDate和EndDate的setter取得它们的所有权(我不知道java是否会这样做,所以我可能错了)你必须先将它们存储在局部变量中将它们分配给事件,以便您可以在之后调用释放。 所以它看起来像这样:

    NSDate *sDate = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:[startDate intValue]];
   theEvent.startDate = sDate;
   [sDate release];