这让我疯了,所以我希望有人可以帮助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];
这个编译没有任何错误,但导致我的应用程序爆炸,所以我想我的理解中缺少了一些东西。知道我哪里出错了吗?
谢谢,
标记
答案 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];