2011-10-31 66 views
0

我使用Tapku日历上我的项目。在方法选择的日期EXC BAD访问错误

我发现在view.Here另一种观点是我的代码

- (void)calendarMonthView:(TKCalendarMonthView *)monthView didSelectDate:(NSDate *)date { 

    self.dataController=[[TimeCardDataController alloc] init]; 
    self.dataController.managedObjectContext=[self context]; 
    [self.dataController initWithTimeCards]; 

    NSDate *weekStartDay=[date weekFirstDate]; 
    NSDate *weekEndDay=[date weekLastDate]; 
    self.billdailyValuePositiveArray= [self.dataController getTimeCardWithStartData:date endDate:date timeCardType:TIMECARD_STATUS_BILLABLE]; 
    self.billweeklyValueNegetiveArray= [self.dataController getTimeCardWithStartData:weekStartDay endDate:weekEndDay timeCardType:TIMECARD_STATUS_NONBILLABLE]; 
    self.billweeklyValuePositiveArray= [self.dataController getTimeCardWithStartData:weekStartDay endDate:weekEndDay timeCardType:TIMECARD_STATUS_BILLABLE]; 
    self.billdailyValueNegetiveArray= [self.dataController getTimeCardWithStartData:date endDate:date timeCardType:TIMECARD_STATUS_NONBILLABLE]; 

    self.syncweeklyValuePositiveArray=[self.dataController getTimeCardWithStartData:weekStartDay endDate:weekEndDay timeCardType:TIMECARD_STATUS_SYNCED]; 
    self.syncweeklyValueNegetiveArray=[self.dataController getTimeCardWithStartData:weekStartDay endDate:weekEndDay timeCardType:TIMECARD_STATUS_NOTSYNCED]; 
    self.syncdailyValuePositiveArray= [self.dataController getTimeCardWithStartData:date endDate:date timeCardType:TIMECARD_STATUS_SYNCED]; 
    self.syncdailyValueNegetiveArray= [self.dataController getTimeCardWithStartData:date endDate:date timeCardType:TIMECARD_STATUS_NOTSYNCED]; 

    self.postweeklyValuePositiveArray= [self.dataController getTimeCardWithStartData:weekStartDay endDate:weekEndDay timeCardType:TIMECARD_STATUS_POSTED]; 
    self.postweeklyValueNegetiveArray= [self.dataController getTimeCardWithStartData:weekStartDay endDate:weekEndDay timeCardType:TIMECARD_STATUS_NOTPOSTED]; 
    self.postdailyValuePositiveArray= [self.dataController getTimeCardWithStartData:date endDate:date timeCardType:TIMECARD_STATUS_POSTED]; 
    self.postdailyValueNegetiveArray= [self.dataController getTimeCardWithStartData:date endDate:date timeCardType:TIMECARD_STATUS_NOTPOSTED]; 


    [self toggleCalendar]; 

    [self doOn:date]; 

} 

的方法做显示另一种观点。但点击日期后,它会显示视图。但在此之后,系统显示EXC_BAD_ACCESS.Any想法..我正在尝试但无法找到该错误。请我需要帮助

这里是上述:::::::方法的代码

-(NSMutableArray *) getTimeCardWithStartData:(NSDate *) startDate endDate:(NSDate *)endDate timeCardType:(NSString *) timeCardType 
{ 
    NSMutableArray* timeCardArray=[[NSMutableArray alloc] init]; 

    NSMutableArray *categoryTimeCardArray=[[NSMutableArray alloc] init] ; 
    if ([timeCardType isEqualToString:TIMECARD_STATUS_BILLABLE]) 
    { 
     categoryTimeCardArray=[self fetchedTimeCardWithStartDate:startDate endDate:endDate fetchedCategoryTimeCard:self.fetchedBillableTimeCards]; 

    } 
    else if([timeCardType isEqualToString:TIMECARD_STATUS_NONBILLABLE]) 
    { 
     categoryTimeCardArray=[self fetchedTimeCardWithStartDate:startDate endDate:endDate fetchedCategoryTimeCard:self.fetchedNonBillableTimeCards]; 

    } 
    else if ([timeCardType isEqualToString:TIMECARD_STATUS_POSTED]) 
    { 
     categoryTimeCardArray=[self fetchedTimeCardWithStartDate:startDate endDate:endDate fetchedCategoryTimeCard:self.fetchedPostedTimeCards]; 

    } 
    else if([timeCardType isEqualToString:TIMECARD_STATUS_NOTPOSTED]) 
    { 
     categoryTimeCardArray=[self fetchedTimeCardWithStartDate:startDate endDate:endDate fetchedCategoryTimeCard:self.fetchedNotPostedTimeCards]; 

    } 
    else if([timeCardType isEqualToString:TIMECARD_STATUS_SYNCED]) 
    { 
     categoryTimeCardArray=[self fetchedTimeCardWithStartDate:startDate endDate:endDate fetchedCategoryTimeCard:fetchedSyncedTimeCards]; 

    } 

    else if ([timeCardType isEqualToString:TIMECARD_STATUS_NOTSYNCED]) 
    { 
     categoryTimeCardArray=[self fetchedTimeCardWithStartDate:startDate endDate:endDate fetchedCategoryTimeCard:fetchedNotSyncedTimeCards]; 

    } 





    return categoryTimeCardArray; 


}    

这是initWithTimeCards方法

-(void) initWithTimeCards 
{ 
    [self fetchAllTimeCard]; 
    fetchedTimecards=[[NSArray alloc] init]; 
    fetchedBillableTimeCards=[[NSArray alloc] init]; 
    fetchedBillableTimeCards=[[NSArray alloc] init]; 
    self.fetchedNonBillableTimeCards =[[NSArray alloc] init]; 
    self.fetchedPostedTimeCards=[[NSArray alloc] init]; 
    self.fetchedNotPostedTimeCards=[[NSArray alloc] init]; 
    fetchedSyncedTimeCards=[[NSArray alloc] init]; 
    fetchedNotSyncedTimeCards=[[NSArray alloc] init]; 



    self.fetchedNonBillableTimeCards =[self fetchTimceCardWithBillStatus:TIMECARD_BILL_STATUS_NONBILLABLE]; 
    self.fetchedPostedTimeCards=[self fetchTimceCardWithPostStatus:TIMECARD_BILL_STATUS_POSTED]; 
    self.fetchedNotPostedTimeCards=[self fetchTimceCardWithPostStatus:TIMECARD_BILL_STATUS_NOTPOSTED]; 
    fetchedSyncedTimeCards=[self fetchTimceCardWithSyncStatus:TIMECARD_BILL_STATUS_SYNCED]; 
    fetchedNotSyncedTimeCards=[self fetchTimceCardWithSyncStatus:TIMECARD_BILL_STATUS_NOTSYNCED]; 



} 

`

+1

你可以把你的代码放入代码标签吗? – Wesley

+0

奇怪的是,你有一个在你的dataController对象上调用两次的init。这是故意的吗?也许在调用它两次时存在内存损坏。 – David

+0

谢谢大卫指出了。也许这是错误。我分配,因为在项目的第一阶段,我没有调用init方法两次。我没有分配负载视图方法的对象。但后来我只是这样做了,忘了删除那个声明。 –

回答

0

尝试启用NSZombies看看哪个对象被过度释放(这可能是你的问题)。

有关如何启用它的说明,请参阅How do I set up NSZombieEnabled in Xcode 4?

编辑:此外,请务必检查-initWithTimeCards-getTimeCardWithStartData:endDate:timeCardType方法,看看你过度释放在那里的东西。

编辑2:问题可能是您的某些数组在内存中没有正确保留。尝试将fetchedSyncedTimeCards更改为self.fetchedSyncedTimeCards,然后对fetchedNotSyncedTimeCards执行相同操作。您可能在-fetchTimceCardWithSyncStatus中返回一个自动释放对象,并且之后不保留它,导致您的程序在不再分配的对象上调用方法。

但即使它工作,你应该真的read up on memory management,并确保你的代码不泄漏到处。

+0

我已经启用了NSZombies和malloc的历史。但没有在调试器中显示出来。调试器的堆栈跟踪如下[objc msgsend]; -performRunloopAction -CFRunloop-IS-Call-out-to-an-observer回调函数 –

+0

好的,你没有看到对你自己的类中过度释放的对象或方法的任何引用? 你可以发布其他方法的代码(我在编辑中提到的那些代码)? –

+0

:我已经添加了两种方法的代码 –